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

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

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

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

Q&A

解決済

2回答

16334閲覧

C#でのメンバ変数名とクラス名の重複について

d415uk35470

総合スコア45

C#

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

0グッド

1クリップ

投稿2018/01/28 09:09

編集2018/01/28 10:42

前提

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

(質問1,2,3...みたいに書いてもらえると答えやすいでしゅ><)

左辺のUserIdは変数、右辺のUserIdはクラス、と判別してくれるのでしょうか。

はい。判別してくれます。
C#の仕様上問題ありません。

クラス名と変数名の重複を推奨しているとあります。

情報が古いため元記事のリンク先が既に消えていました。
Googleで探すと.NET Framework 1.1時代のアーカイブされた古い内容でした。
モダンな内容ではない為、「クラス名と変数名の重複を推奨する」という件は忘れていいと思います。
実際にどう書くかは開発時のコーディング規約の問題です。
https://msdn.microsoft.com/ja-jp/library/cc433291(v=vs.71).aspx

必ずthisを書くようにすれば可読性としては変数だとわかりやすくなる気がします。

C#の仕様上冗長となりますが開発時にその方が良いと思われるのであれば書いても問題ありません。
ただし、冗長なので以下の画像のようにヒントが表示されます。
https://i.imgur.com/WXtQqdv.png
thisを書くかどうかは開発時のコーディング規約の問題です。

しかしそれもそもそも変数名の頭が小文字ならいらない心配なように思いますし、本末転倒な気がします。

C#はPascalまたはCamel形式が主に利用されています。
また、変数名の大文字小文字で意味合いが違ってきます。
(言語仕様としてではなく変数名で意味がわかるような名前付けガイドラインがあり、それが広く知られて使われています※1)
一部抜粋すると以下の通りです。

  • プロパティ

publicな時に使います。
変数名はPascal形式が利用されます。
public int UserId {get; set;}

変数名とクラス名が同じことにむしろメリットがある、のでしょうか?

先程の記事が情報源だと思うのでこの点についてはメリットもデメリットもあまり無いと考えます。
適切な名前がつけられていて偶然、変数名とクラス名が同じになってしまった場合は私個人としては特に違和感を感じません。
どのように書くかは開発時のコーディング規約の問題です。

可読性を保つために一般的に行われている書き方などあるのでしょうか。

※1のような一般的な名前付けガイドラインに従うことを推奨します。

それともそもそも変数名とクラス名の見分けをつけたいという考え自体がナンセンスなんでしょうか。そんな必要はない、のでしょうか。

C#をIDE(VSやRiderやMonoDevelop系)で開発されると思いますが、全てIntellisenseによる強力なサポートや色付け機能がある為、変数なのかクラスなのかが瞬時にわかります。
そもそもクラスと変数名は別々の名前をつけることが多いはずです。
Class Color { ... }に対してpublic Color BackgroundColor {get;set;}public Color FrontColor{get;set;}のように。

難しく考えなくても問題ないと思います。

※1
https://msdn.microsoft.com/ja-jp/library/ms229043.aspx

投稿2018/01/28 10:19

編集2018/01/28 11:32
aglkjggg

総合スコア769

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

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

d415uk35470

2018/01/28 10:57

>質問1,2,3...みたいに書いてもらえると答えやすい そうですね、ありがとうございます。次回からそのようにしたいと思います。 > 情報が古いため なるほど、初学者としてはわかりづらいところなのでありがとうございます。 > 一部抜粋すると以下の通りです。 ありがとうございます。 privateとローカル変数はCamelなんですね。そしてPublicはPascal。この点とてもすっきりしました。 ※1を拝見しているのですが、publicについては記述が多くありますが、privateについての記述がまだ見つけられていません。メソッド名のつけ方なども知りたいと思いまが privateはマイクロソフトとしては特に指定をしていない が、一般的にはcamelCase メソッド名も同様で、publicはPascalCase、privateはcamelCase、と思ってよいでしょうか?それともメソッド名はまた別でしょうか? 追加質問ですみません。「ここを見ろ」と参考リンクご提示いただくだけでも大丈夫です。
aglkjggg

2018/01/28 11:40 編集

すみません。privateのところは嘘でした。 抜粋と書いているにも関わらず主観が混ざって書いてしまっていたので修正しました。 private/publicに関係なくメソッドは全てPascal形式がデフォルトです。 実際にメソッドをCamel形式で書くとヒントが表示されます。 https://i.imgur.com/YqDsffm.png (IDEの設定から規則の変更が可能です) 結論からするとprivateに関してはデファクトは無いかもしれません。 ご自身の開発環境、メンバーで決める形で良いかと思います。 corefxでは private static TextReader s_in; ※2 や private bool _enabled;※3 のようにルールが決められているように見えました。 (全部見たわけではないので絶対そうだとは言い切れませんが…) (MSDNでアンダースコアを「使用しないでください」と書いてるのに使ってますね…) また、const はprivate/publicに関係なく Pascal形式のようです。※4 ※2 https://github.com/dotnet/corefx/blob/master/src/System.Console/src/System/Console.cs#L18 ※3 https://github.com/dotnet/corefx/blob/master/src/System.ComponentModel.TypeConverter/src/System/Timers/Timer.cs#L19 ※4 https://github.com/dotnet/corefx/blob/master/src/System.Console/src/System/Console.cs#L16
d415uk35470

2018/01/28 14:50

なるほど、ありがとうございます。MSDNには書いてないが、そのほうが良いとご自身がお考えとのことですね。(僕も個人的にはprivateとpublicで命名分けたい派なのでしっくりきます、、、がPascalがデフォルトなんですね) private/publicを名前で区別つくようにしたいという思想自体がMS的には不要だよね、ということなんでしょうか、 と思いながら、おっしゃるように参考リンク拝見すると、アンダースコアつきで、しかもcamelでprivateを区別しているように見えますね。 要は、MS内でも揺れているくらいだが、C#コミュニティとしてはあまり気にしておらず、つまり開発者やチーム個々人にゆだねられる部分が大きく、コミュニティ全体としてデファクトスタンダードはこれ、というのがあまりないということなのでしょうかね。神であるべきMSでこれですし。 それならそれで、その範囲内で自分とチームのストレスのないようにスタイルを組もうと思います。 色々勉強になりました。ありがとうございました。
guest

0

可読性が悪いと感じたことはありません。クラスとオブジェクトは使える文脈が違うので間違えることはないでしょう。

それぞれの言語にはそれぞれの流儀があります。
JavaScript のようにクラスの無い言語だと可読性が悪くなるかもしれませんね。

投稿2018/01/28 10:01

Zuishin

総合スコア28660

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

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

d415uk35470

2018/01/28 10:04

回答ありがとうございます。気にしないでよい、ということですね。ググってもわかりづらかったニュアンスの部分なのでご回答いただき助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問