前提
ECMAScript系の言語は経験があります。
しかしC系は簡単にしか経験がなく、言語ならではの常識はわかっていない状態のため、ググってもよくわからなかったので質問です。
追記 : また、調べても、これとはっきりしたデファクトスタンダード的な書き方がない?ようにも思えてしまします。
わからないこと
表題の通り、メンバ変数名と、クラス名の重複についての考え方がよくわかりません。
まず前提として、JavaScriptなどでは(以下は疑似コードのためそのまま実行できるわけではありません)
例えば
class UserID{ } class User{ userId; }
といった感じで、メンバ変数は一般的に頭を小文字でつけると思っています。そのため
userId = new UserId();
というようなコードが書けます。(JSの場合はメンバ変数ならthisがいるよね、ということは認識はしておりますが本題ではないので横に置かせてください。)
しかしC#を勉強しはじめたところ
メンバ変数は頭を大文字で書くのですね。
となると
UserId = new UserId();
というコードになってしまうように思います。
イメージでいうと以下のように今まではかき分けていました。
class UserId{ constructor(){} public start(){} private _start(){} public value; public get value(){ return _value; } // propertyの場合 private _value; static public VALUE; static private _VALUE; }
質問
言語機能的にはコンパイラが賢くて
UserId = new UserId();
で問題なく、左辺のUserIdは変数、右辺のUserIdはクラス、と判別してくれるのでしょうか。
また参考記事などには、むしろクラス名と変数名の重複を推奨しているとあります。
もしコンパイラ的には問題ないとしても、不便ではないのでしょうか。インスタンスなのかクラスなのかわからなくなってしまう、とJSな人間からすると思ってしまいます。
this.UserId = new UserId();
と必ずthisを書くようにすれば可読性としては変数だとわかりやすくなる気がします。しかしそれもそもそも変数名の頭が小文字ならいらない心配なように思いますし、本末転倒な気がします。
変数名とクラス名が同じことにむしろメリットがある、のでしょうか?
可読性を保つために一般的に行われている書き方などあるのでしょうか。それともそもそも変数名とクラス名の見分けをつけたいという考え自体がナンセンスなんでしょうか。そんな必要はない、のでしょうか。
アンダースコア
クラス名の話ではないのですが、アンダースコアも使わないほうがよいとのことで、例えば
class UserId{ private _value = 1; public Value {get{ ... }} }
みたいに書きたくなった時もありましたが
そういうのもだめなんですね。
ValueInternalみたいな名前にすればよいのでしょうか。
調べていたのですが、C#的な常識がわからず。C#に詳しい方に伺いたく思いました。
追記 : アンダースコア別に良いという方もおられますね。。。
参考
C# CODING GUIDELINES - Qiita https://qiita.com/Ted-HM/items/67eddbe36b88bf2d441d#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3
「【修正】クラス名とプロパティ名が同じにできなくて困っていませんか?」(1) Insider.NET - @IT http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=43502&forum=7
C#の命名規約について | jikkenjo.net http://jikkenjo.net/198.html
C#の命名規約について | jikkenjo.net http://jikkenjo.net/198.html
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/28 10:57
2018/01/28 11:40 編集
2018/01/28 14:50