【发布时间】:2012-02-13 23:17:13
【问题描述】:
我阅读了其他主题,例如 this,但它们对我不起作用。
我有两门课:
public class ClassA
{
public string _shouldBeInteger;
public string _shouldBeBool;
public string _shouldBeDateTime;
}
public class ClassB : ClassA
{
public int? shouldBeInteger
{
get { return (_shouldBeInteger != null) ? Convert.ToInt32(Convert.ToDouble(_shouldBeInteger)) : new int?(); }
set { _shouldBeInteger = Convert.ToString(value); }
}
//... same thing with datetime etc.
}
如果我现在创建一个 ClassB 的新对象,我会得到 p>
_shouldBeInteger, _shouldBeBool, _shouldBeDateTime;
shouldBeInteger,shouldBeBool,shouldBeDateTime
但我想向用户隐藏 _variables。 在 ClassB 中将它们设置为私有将覆盖它们,但我需要访问它们才能解析字符串值。
更新
有一个 ClassC 填充 ClassAs 的值,这主要是它们必须是可写的原因。我无法改变工作方式,但我完全控制了 ClassA 和 ClassB
ClassC //not changeAble for me
{
//infomagic filling values of ClassA
}
将 ClassA 变量设置为 private 将不起作用,因为 ClassA 的程序员以一种奇怪的方式生成它。
解决方案
因为 ClassA 需要可写,但不能被继承的其他类读取,我终于得到了这个:
ClassA
{
public string _shouldBeInteger { protected get; set; }
//and so on
}
这会导致 ClassB 使用这些属性,而不会将它们提供给外部。 Intellisense 仍会显示它们,但您可以考虑使用:
[EditorBrowsable(EditorBrowsableState.Never)]
解决这个问题。
谢谢大家。
【问题讨论】:
-
当您说将字段设置为私有不起作用时,它们需要公开还是受保护的工作?
-
下划线前缀是
private members的标准,而不是public members -
只是对@gdoron 的评论进行挑剔,下划线前缀不符合 CLS,因此不符合标准,但私有成员不是 CLS 合规性的问题。因此,它们被允许并具有以下优势:如果您在探索问题时将某些私有内容移至公共,CLS 合规性警告将标记它不处于最终发布的良好状态。
-
“因为 ClassA 的程序员以一种奇怪的方式制作了它”——该死的,他做到了!
-
@JonHanna 这是一个很好的观点。 .NET 语言不保证/不要求支持带有前导下划线的成员名称。虽然我不知道有任何 .NET 语言不知道。