質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

258閲覧

.Net Framework 既存の名前空間い定義されたメソッドについて

BitCoin

総合スコア53

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/11/29 16:28

linqなど既存のマイクロソフトなどが作った既存の関数についていくつか疑問があります。例えば↓のコード

C#

1var list = List<string>{ 2 3"tokyo", "hiroshima","osaka" 4 5} 6var exists = list.Exists(s => s[0] == 'A'); 7Console.WriteLiner(exists);

これですが、listから先頭の文字がAで始まる文字列を探しなかった場合はfalseを返すのですがこのExistsメソッドはまずlistにあるstring型の配列をすべて抽出し、抽出したstringをPredicate<t>にデリゲードで渡した引数sにそのsの先頭文字Aと合致するものを取り出すと推測しました。


しかし毎回マイクロソフト側が定義しためそっどを理解することは困難だと思います。
このあらかじめ用意されているlinqやSystemといった名前空間にあるメソッドの中身を見ることはできないのでしょうか?
また、このようなメソッドはすでにバイナリ化?されていると聞きましたがそれを解読する方法などあるのでしょうか?
またstrng型のs = "aaa"でs[0]はcharの'a'が帰ってくるのはなぜなのでしょう?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

.NET Frameworkのソースコードを見るには下のサイトを参照してください。
http://referencesource.microsoft.com/
例のExistsの場合はSystem.Collection.Generic.List<T>.Existsです。

そして、すでにbinary化されたコードでもDecompilerを使用すればソースを見ることができます。
もちろんこの場合はコンパイルした時のソースではないですが、大体の働きは推定できます。
JetBrain社のDotPeekを推薦します。

3番目の質問はKSwordOfHasteさんがよく説明しましたので省略します。

投稿2017/11/29 23:20

編集2017/11/29 23:38
gazette2

総合スコア179

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

毎回マイクロソフト側が定義しためそっどを理解することは困難

大多数のプログラマーは「プログラム全体を自前で書くことなどない」ので何かしら他人が書いたライブラリーを使います。それを理解するためにリファレンスやドキュメントがありますし、実装の詳細をみることができなくても、ある程度アルゴリズムの勉強をしていれば「おそらくこう実装されているだろう」あるいは「少なくともこういう性質であるはずだ」というのは予測できることが多いと思います。そうでなければ一々中身を見なければならないことになり、さすがにそんなことはやってられません・・・

メソッドの中身を見ることはできないのでしょうか?

たまにデバッグ目的で見たいことがあります。Visual Studioのオプション設定で.NETのソースもデバッグ対象にできますし、ソースがなくてもIL(か機械語だったかは忘れましたが)を見ることはできたと思います。「visual studio デバッグ .net ソース」で検索すると具体的な方法の解説ページにヒットすると思います。しかしながら全てのコードが見えるわけでもなさそうです。

バイナリ化?されていると聞きましたがそれを解読する方法などあるのでしょうか?

上に述べた通りオプション設定によってIL or 機械語を見ることができたと思います(自分は普段やらないので詳しくはないです)。効率などを気にする場合、自分のソースコードをコンパイルした結果を見ることはあります。また逆アセンブラーを使うとオブジェクトファイルの一部(特定の関数)を調べることもできたと思いますが自分はそこまでやったことがないです。機械語やILは大変読みづらいのでそれを読む努力をするなら、もっと他の点を工夫しり学んだ方がよいと思います。(アセンブリー言語の基礎的な知識程度はあっても悪くない気はしますが。)

string型のs = "aaa"でs[0]はcharの'a'が帰ってくるのはなぜ

stringは文字(char)の列と考えるのが自然だからだと思います。Javaなどもそうですね。しかしJavascriptやPythonなど他の言語では単なる長さ1の文字列なのでこのあたりは「言語の特性」として「そういうものだ」ぐらいに考えてもよいと思います。


補足:上記で機械語と言っている箇所は「アセンブリー言語」も含めていっているつもりです。いわゆる機械語は数字の羅列なので普通の人は読めない気がします・・・

投稿2017/11/29 18:36

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問