通知
すべてクリア
17/03/2021 9:46 pm
techsta_unity_api\UnityProject\DataTest01_Memory
のCommonLib.csでjsonをデコードしたものを
リストとして、また、一つ一つの元素をディクショナリとして処理する部分で
のCommonLib.csでjsonをデコードしたものを
リストとして、また、一つ一つの元素をディクショナリとして処理する部分で
var json = (IList)Json.Deserialize(sStrJson);
IList results = (IList)json;
foreach (IDictionary resultOne in results)
{
string name = (string)resultOne ["name"];
long age = (long)resultOne["age"];
string hobby = (string)resultOne["hobby"]; responseStr += string.Format("{0}:{1}:{2}\n", name, age, hobby);
}
ここでIListやIDictionaryを使用する理由は何でしょうか?
最初、「IListがIEnumerableを実装(継承?)しているので、foreachを使えるから」という理由と思ったのですが、
ListでもIEnumerableを実装しているのでわざわざIListを使用する理由がわかりませんでした。
ListでもIEnumerableを実装しているのでわざわざIListを使用する理由がわかりませんでした。
IDictionaryについても同様にただのDictionaryを使用しない理由がわかりません。
ご教授いただけますようお願いします。
ご教授いただけますようお願いします。
※また、ついでで恐縮なのですが、「IListがIEnumerableを実装している」という文章を
どこかのWebページでみつけたのですが、こちらは「実装」ではなく「継承」だと思うのですが、「実装」と「継承」は同じ意味と考えてよいのでしょうか?
どこかのWebページでみつけたのですが、こちらは「実装」ではなく「継承」だと思うのですが、「実装」と「継承」は同じ意味と考えてよいのでしょうか?
This topic was modified 4年前 by Student
17/03/2021 9:48 pm
結論から言うと、「List
」でも「IList
」でもどちらでも構いません。
ですが、IList
の方はinterfaceですので、Add
等のメソッドは実装されていません(宣言がされているだけですね)
なので逆に言えば、Add
やRemove
等を使わないのであれば、IListで十分ということです。
これは他人がプログラムを見る時に非常に有用な書き方であり、「IListで宣言されたオブジェクトはAdd
やRemove
を行わないものである。」とひと目でわかるメリットがあります。IDictionary
も同様なメリットがあります。
一人で開発をしているとなかなか気が付かない部分ですね。
※実装と継承について
少し難しいですが、そもそもinterfaceとclassの継承は別のものです。
interfaceを継承してクラスを定義することを、「interfaceを実装する」と言います。
なぜかと言うと、interfaceには中身が実装されておらず、宣言のみされているからですね。
その代わり、interfaceで宣言されているメソッド(抽象メソッド)は実装先でoverrideを強制されます。
継承先で中身の実装を必ず行うので、interfaceのことは継承すると言わずに実装するという訳です。
interfaceは今後の開発で役立つと思うので、しっかり調べておくことを勧めます。
https://ufcpp.net/study/csharp/oo_interface.html