我在命名类的内部变量时不使用前缀(我知道有些但是我没有开始“为什么你......”辩论)。我只是喜欢这样。问题是有时在构造函数中传递相同的参数,我最终会混淆如何命名它们。例如:
public class SampleClass { private int classId; private string className; public SampleClass (int XclassIdX, string XclassNameX) { classId = XclassIdX; className = XclassNameX; } }
如何命名XclassIdX和XclassNameX?
可能做的一件事是:
public class SampleClass { private int classId; private string className; public SampleClass (int classId, string className) { this.classId = classId; this.className = className; } }
不确定这是一个好主意还是还有其他更优雅的方式?
答案 0 :(得分:17)
我认为您正在描述的解决方案,构造函数参数的名称相同,并且您使用this
为类成员添加前缀,这很好。很清楚,它很简洁,并且没有混淆你的意思。
答案 1 :(得分:4)
我只是使用this
方法;然后我所有的变量和字段都反映了他们的意图不要做X
事 - 那只是丑陋的;-p
答案 2 :(得分:3)
我这样的情况,我认为任何一种方式都不比其他方式更好。但是为了那些可能需要维护你的代码的人(以及你自己的代码),我只想选择一种方法来做它并保持一致。
答案 3 :(得分:1)
将成员和参数与“m_
”和“p_
”或“s_
”作为前缀
不要修饰属性或本地,当您认为必须将它们命名为相同(忽略大小写)时,请通过在属性前添加“this”来解决冲突。 ”
考虑至少有四(4)种不同类别的可读/可分配名称需要区分:本地变量,成员变量(实例和静态),< strong>属性,方法参数。所有四个类别都可能出现在一个代码块中,因此它们都需要明确的区分特征。
有意义的前缀可以同时区分变量和显示其范围,例如m_(成员),s_(静态),p_(参数),使公共属性和局部变量保持简单,不带前缀和不必担心区分大小写。如果由于某种原因,您必须将本地名称与属性相同而不考虑大小写,则只需在属性前加上“this”。
局部变量和参数之间的命名冲突不会发生,因为它们不能被命名为相同的东西(编译器将捕获重复的定义)。 会员变量和属性也是如此。分别以“p_”和“m_”为前缀的参数和成员不会发生冲突,并且可以通过添加“this”来解决非前缀本地和属性之间的冲突。属性。
我的建议的替代方案并不漂亮:用例敏感(不好主意,因为并非所有CLR语言都区分大小写),自己使用下划线(也很糟糕,因为它可能会与标准发生冲突并且不会告诉您该死的东西),或者完全使用不同的名字(可能很费时,很难,而且显得随意)。
答案 4 :(得分:0)
为什么不为您的私有成员变量添加下划线或单个字母前缀。 如果您不喜欢这个想法,那么您在第二个代码块中所做的就是好的。
答案 5 :(得分:0)
将X放在你的参数上是不好的。构造函数是您的类的公共接口的一部分,它只会混淆您的类的用户。有些人喜欢在成员变量前面加上下划线,因为它只对你的类的实现者可见。否则,在第二个例子中使用它就足够了。
答案 6 :(得分:0)
m_foo
公共财产Foo
foo
用于参数和局部变量。
我更喜欢将块范围与扩展范围成员区分开来,这就是我坚持使用前缀的原因。
答案 7 :(得分:-1)
您需要以某种方式将它们分开。使用'this。'是一种弱的匈牙利符号形式,所以你不妨咬紧牙关并使用下划线或'm_'。
我也觉得'这个'。实际情况更糟,因为在极端情况下(即大方法),'这可能'。将被关闭,将引用错误的变量。我知道大型方法很糟糕,但它们确实会在实际业务应用程序中自然发生,而且开发人员技能各异使用私有字段的前缀将阻止该情况。
很有可能认为下划线可能会像“这个”一样被遗忘。将。但这是不正确的,因为下划线会更改变量的名称,因此唯一可能遗忘的地方是定义,而不是文件中的使用。而与'这个'。如果在使用过程中忘记它,则前缀没有编译器错误。
无论你选择什么,在这种情况下都不会避免匈牙利人使用'this'。或下划线。无论如何,它并没有那么糟糕,我们被迫使用匈牙利语来使用接口名称,控制名称以及其他我现在想不到的地方。