Skip to content

Instantly share code, notes, and snippets.

@gothedistance
Last active October 14, 2022 22:59
Show Gist options
  • Save gothedistance/5243455 to your computer and use it in GitHub Desktop.
Save gothedistance/5243455 to your computer and use it in GitHub Desktop.
Sessionに格納する値が連想配列とオブジェクトのどっちがいいかという話
Dictionary<string,string> dict = new Dictionary<string,string>();
dict.add("name","POSTされた値");
dict.add("address","POSTされた値");
.
.
.
Session["data"] = dict;
//これを取り出す時にはこうなる
Dictionary<string,string>dict = (Dictionary<string,string>)Session["data"];
string name = dict["name"];
//この書き方では、もしも連想配列に取得したキーが違った場合にerrorが起きる。
//dict["username"]で取得しようとすると、例外が発生しまう。
//なので、オブジェクトを作ってこのような形で格納すると良い。
FormData data = new FormData();
data.name = "POSTされた値";
data.address = "POSTされた値";
Session["data"] = data;
//取り出しはこうなる
FormData data = (FormData)Session["data"];
//ここが肝ですよ!!
string name = data.name;
@gothedistance
Copy link
Author

Sessionに格納する値が連想配列とオブジェクトのどっちがいいかという話で、 c#ならオブジェクトを使うべき理由を書きました。

連想配列ですと、存在しないキーがあった場合に実行時にエラーが出てしまいます。
また、その連想配列の仕様が隠蔽されるのでSessionの中に格納された値が何なのか、
それが文字列なのか数値なのかも、よくわからなくなります。

なので、Sessionに格納する値はなるべくオブジェクトの方が便利ですし安全です。

オブジェクトにすれば、コンパイラが入力の保管もしてくれますし、存在しない
プロパティにアクセスすることはできません。

連想配列に比べて格納されるオブジェクトが可視化され、変数の型も予め予測出来ます。
複数画面で共有されるデータなら、なおさらオブジェクトにする方が良いでしょう。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment