SlideShare a Scribd company logo
1 of 37
結果がイメージしにくいコードと
実行結果 for .net
2018年10月13日 第16回 まどべんよっかいち
可知 一輝
自己紹介
 ひとりでやってます(ふりーらんすえんじにあとか言うらしい)
 SNS Accounts
 Facebook:Kazuki.Kachi
 Twitter :@kazuki_Kachi
 Microsoft MVP for Developer Technologies(2017-2019)
今日は、ネタがなかった参加者が意外にかぶって
いたので8月に話した微妙にわかりにくいコードの
実行結果の解説をしてみる時間です。
当時書いた前提はこちら
• 正解しても商品とかはありません。
• これどうなるんでしたっけ?的なコードを集めた(つもり)
• 間違えても誰にも怒られたりはしませn。
• 疑問に思った事は聞いてください(誰かが答えてくれるハズ)
• 実行環境は、.Net core 2.1(Windows10 1803)です。
とはいえ、参加してない方もいらっしゃいますし、参加
していたとしても覚えていない方が大半だと思います。
当時使用したコードと実行結果をもとに進めていきます。
※コードは一部省略しています。
※using ブロックはすべて省略
結果はどうなる?(その1)
static void AddVisualBasic(List<string> target) => target?.Add("VisualBasic");
static void Main(string[] args)
{
:
var languages = new List<string>() { "C#" };
AddVisualBasic(languages);
WriteLine(languages);
}
結果はこうなる(その1)
System.Collections.Generic.List`1[System.String]
何故こうなる(その1)
object classのToString()Methodの実装が、
return GetType().ToString();
となっており、List<T>classはToString()Methodをoverrideしていないため。
Javaなんかだと、内部の値を表示してくれたりするけど、C#はそこまでしてくれない。
結果はどうなる?(その2)
static void AddVisualBasic(List<string> target) => target?.Add("VisualBasic");
static void Main(string[] args)
{
:
var languages = new List<string>() { "C#" };
AddVisualBasic(languages);
languages.ForEach(WriteLine);
}
結果はこうなる(その2)
C#
VisualBasic
何故こうなる(その2)
C#では、キーワードを指定せずMethodに引数を与えた場合、stackのコピーが渡される。
classの場合、stackにinstanceではなくinstanceの場所(Address)が格納されているため、
instanceに対する変更は呼び出し元に伝搬される。
結果はどうなる?(その3)
{
:
void changeList(List<string> target)
{
target = new List<string> { "VisualBasic" };
};
var languages = new List<string>() { "C#" };
changeList(languages);
languages.ForEach(WriteLine);
}
結果はこうなる(その3)
C#
何故こうなる(その3)
C#では、キーワードを指定せずMethodに引数を与えた場合、stackのコピーが渡される。
この場合のtargetはあくまでlanguagesのAddressが格納されてはいるものの、
languegesとは別なのでtargetを書き換えても呼び出し元には伝搬しない。
結果はどうなる?(その4)
interface IValue<T> { T Value { get; set; } }
struct ValueStruct<T> : IValue<T>
{
public T Value { get; set; }
public override string ToString()
=> $"Value is {Value?.ToString() ?? "null"}!";
}
{
:
void changeValue<T>(ValueStruct<T> target, T value) => target.Value = value;
var v = new ValueStruct<int>() { Value = 5 };
changeValue(v, 100);
WriteLine(v);
}
結果はこうなる(その4)
Value is 5!
何故こうなる(その4)
C#では、キーワードを指定せずMethodに引数を与えた場合、stackのコピーが渡される。
structの場合、stackにinstanceが格納されているため、
instanceに対する変更はあくまでもコピーに対する変更のため、呼び出し元に伝搬されない。
結果はどうなる?(その5)
interface IValue<T> { T Value { get; set; } }
struct ValueStruct<T> : IValue<T>
{
public T Value { get; set; }
public override string ToString()
=> $"Value is {Value?.ToString() ?? "null"}!";
}
{
:
void changeValue<T>(IValue<T> target, T value) => target.Value = value;
var v = new ValueStruct<int>() { Value = 5 };
changeValue(v, 100);
WriteLine(v);
}
結果はこうなる(その5)
Value is 5!
何故こうなる(その5)
C#では、キーワードを指定せずMethodに引数を与えた場合、stackのコピーが渡される。
interfaseの場合はclass同様、stackにinstanceのaddressが格納されているが、
作成したinstance(宣言した変数の型)はstructのため、stackがコピーされた後、参照が渡されるため、
結果instanceに対する変更コピーに対する変更になり、呼び出し元に伝搬されない。
余談ですが、先のコードの、
var v = new ValueStruct<int>() { Value = 5 }; を
IValue v = new ValueStruct<int>() { Value = 5 }; に変更すると、
vは参照型の変数になるため変更結果が伝搬する
結果はどうなる?(その6)
{
:
var i = 0;
void output() => WriteLine(i);
i = 100;
output();
}
結果はこうなる(その6)
100
何故こうなる(その6)
Local関数(lambda式含む)は、実際にはprivateなMethodとして生成され、実行される。
この場合、output()はprivate staticなMethodとして展開され、
int iはoutputから参照できるスコープに移動される(VisualStudioを使用している限り意識することはない)
そのため、output()を実行する前にi の値を変更したら、変更後の値が出力される
(展開イメージ(実際の展開結果ではありません))
static int i;
static void Output() => WriteLine(i);
{
i = 100;
Output();
}
結果はどうなる?(その7)
{
:
var i = 0;
Action output(int value) => () => WriteLine(value);
var act = output(i);
i = 100;
act();
}
結果はこうなる(その7)
0
何故こうなる(その7)
このケースでは、int i を int value に渡した時点のi と value の関係は、
value は output()を呼び出した時点のi の値のコピーであるため、その後iをいくら変更しても
Valueには伝搬しない。
結果はどうなる?(その8)
{
:
var i = 0;
Action act = () => WriteLine(i);
while(10 > ++i) act += () => WriteLine(i);
act();
}
結果はこうなる(その8)
10
10
10
10
10
10
10
10
10
10
何故こうなる(その8)
その6に書いたことと同じ理由。
結果はどうなる?(その9)
{
:
Action act = null;
foreach(var i in Enumerable.Range(0, 10)) act += () => WriteLine(i);
act();
}
結果はこうなる(その9)
0
1
2
3
4
5
6
7
8
9
何故こうなる(その9)
iは、ループのたびに生成され、解放されている。
すなわちWriteLineが最初に受取ったiと次に受取ったiは別のものとしてキャプチャされる。
(foreachの展開イメージ)
using(var ie = Enumerable.Range(0, 10).GetEnumerator())
{
while(ie.MoveNext())
{
var i = ie.Current;
act += () => WriteLine(i);
}
}
結果はどうなる?(その10)
Shared Sub Q10()
WriteLine(1 / 2)
End Sub
結果はこうなる(その10)
0.5
何故こうなる(その10)
VisualBasicのoperator /(Integer,Integer)の戻り値の方はDouble。
…察してください。
ちなみにVBでInteger型の商を得る演算子は、(Integer,Integer)
ここで紹介できたコードは、実行結果がイメージと違う
かもしれないコードのほんの一部です。
しかも、該当箇所を抜粋しています。
書きたくなる場面もあるかもしれませんが、
未来の自分のためにもなるべく書かないことを押すsumし
ます。
ありがとうございました。

More Related Content

Similar to Unimaginable code & commentary

Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Yuto Takei
 
Unity C#3からC#6に向けて
Unity C#3からC#6に向けてUnity C#3からC#6に向けて
Unity C#3からC#6に向けてonotchi_
 
Microsoft Learn で C# を学ぶとどんな感じ?
Microsoft Learn で C# を学ぶとどんな感じ?Microsoft Learn で C# を学ぶとどんな感じ?
Microsoft Learn で C# を学ぶとどんな感じ?m ishizaki
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜JustSystems Corporation
 
Thread affinity and CPS
Thread affinity and CPSThread affinity and CPS
Thread affinity and CPSKouji Matsui
 
私のチームのリーダブルコード
私のチームのリーダブルコード私のチームのリーダブルコード
私のチームのリーダブルコードKeisuke Tameyasu
 
復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0Yuta Matsumura
 
ソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビューソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビューMoriharu Ohzu
 
タダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitタダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitYasuhiko Yamamoto
 
C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26Yoshihisa Ozaki
 
Road to success System.IO.Compression.ZipArchive Feedback
Road to success System.IO.Compression.ZipArchive FeedbackRoad to success System.IO.Compression.ZipArchive Feedback
Road to success System.IO.Compression.ZipArchive FeedbackKazushi Kamegawa
 
Inside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfesInside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfesTakeshi Komiya
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんかcch-robo
 
Look into Project Valhalla from CLR viewpoint
Look into Project Valhalla from CLR viewpointLook into Project Valhalla from CLR viewpoint
Look into Project Valhalla from CLR viewpointLogico
 
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部Kiyoshi Ogawa
 
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。Satoshi Mimura
 

Similar to Unimaginable code & commentary (20)

Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)
 
Unity C#3からC#6に向けて
Unity C#3からC#6に向けてUnity C#3からC#6に向けて
Unity C#3からC#6に向けて
 
Microsoft Learn で C# を学ぶとどんな感じ?
Microsoft Learn で C# を学ぶとどんな感じ?Microsoft Learn で C# を学ぶとどんな感じ?
Microsoft Learn で C# を学ぶとどんな感じ?
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
 
C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
 
Thread affinity and CPS
Thread affinity and CPSThread affinity and CPS
Thread affinity and CPS
 
私のチームのリーダブルコード
私のチームのリーダブルコード私のチームのリーダブルコード
私のチームのリーダブルコード
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0
 
ソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビューソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビュー
 
タダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitタダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnit
 
C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26
 
Road to success System.IO.Compression.ZipArchive Feedback
Road to success System.IO.Compression.ZipArchive FeedbackRoad to success System.IO.Compression.ZipArchive Feedback
Road to success System.IO.Compression.ZipArchive Feedback
 
Inside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfesInside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfes
 
C#勉強会
C#勉強会C#勉強会
C#勉強会
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんか
 
Look into Project Valhalla from CLR viewpoint
Look into Project Valhalla from CLR viewpointLook into Project Valhalla from CLR viewpoint
Look into Project Valhalla from CLR viewpoint
 
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
 
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
 

Recently uploaded

【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 

Recently uploaded (12)

【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 

Unimaginable code & commentary