C# 为什么要在属性访问器中使用私有变量?
对不起,如果我是noob,我有这个疑问,为什么我们要使用私有变量并使用属性设置它们 为什么我们不能单独使用properites呢 我说的是这样的情况C# 为什么要在属性访问器中使用私有变量?,c#,asp.net,variables,properties,private,C#,Asp.net,Variables,Properties,Private,对不起,如果我是noob,我有这个疑问,为什么我们要使用私有变量并使用属性设置它们 为什么我们不能单独使用properites呢 我说的是这样的情况 private string _testVariable; public string MyProperty { get { return _testVariable;} set {_testVariable = value;} } 我想简单地使用 public string MyProperty { get; set; }
private string _testVariable;
public string MyProperty
{
get { return _testVariable;}
set {_testVariable = value;}
}
我想简单地使用
public string MyProperty { get; set; }
为什么有多余的私有变量?这两种策略不同吗?有人能解释一下吗
感谢您给出的第二个示例:
public string MyProperty { get; set; }
仅在.Net framework的更高版本中可用(我相信是v3.0以后的版本)
第一个示例允许您在
return
和assignment语句上设置断点,从而在分配/读取属性时导致调试器中断。第一个代码截断所有命令,以修改某些私有类状态。在属性中包装私有状态很好,因为它隐藏了实现。稍后您可以更改实现,并且属性(外部接口)可能保持不变
例如,假设不在setter中设置单个字符串,而是在某种私有存储中设置该字符串。您可以将其写入文件或写入共享内存。或者,您可能只计算字符串的散列,而根本不存储它,就像您使用密码一样
第二个代码片段中的auto属性与私有变量根本不相关。自动属性设计与第一个snip中使用的显式属性设计一样,允许将来进行修改。例如,作为修改的一部分,您可以将自动属性转换为显式实现的属性 您的示例在语义上是相同的。简洁的属性声明语法(仅具有
{get;set;}
)是C#3.0中可用的快捷方式。编译器实际上创建了一个私有支持变量和一个简单的getter和setter,如第一个示例所示
如果您所做的只是创建一个getter和setter(当两者都发生时,实际上什么也没有发生),那么简明语法是一个不错的选择。如果在设置值时必须执行任何其他操作(例如重画控件),则需要完整的语法。属性基本上是字段的包装器。此包装器允许使用来自外部世界的变量。在C#3.0中,您可以简单地声明一个属性,如
publicstringmyproperty{get;set;}
编译器会自动声明一个私有变量,并为此声明get set方法。如果需要在声明属性的类内执行任何计算,则应使用专用字段进行计算。有时您不知道第一次编写代码时是否需要添加更多需要使用专用变量的代码。当然,如果需要,您可以稍后添加它。我只是自动创建私有变量,假设它以后会被使用
这可能与大型企业应用程序或快速发展的应用程序(敏捷)更相关,因为在初始编码过程中可能不知道完整的实现
为什么有多余的私有变量?是
这两种策略不同吗?可以
有人请把灯打开吗
这个
如果您所做的只是读/写一个变量,那么就不会了。否则,您需要一个私有变量的原因有两个:
数据验证
// Data validation
public class IntWrapper
{
private int _value;
public int Value
{
get { return _value; }
set
{
if (value < 0) { throw new Exception("Value must be >= 0"); }
_value = value;
}
}
}
//数据验证
公共类IntWrapper
{
私有整数值;
公共整数值
{
获取{返回_值;}
设置
{
如果(值<0){抛出新异常(“值必须>=0”);}
_价值=价值;
}
}
}
Getter/setter包装了一个底层数据存储
public class StringBuffer
{
List<char> chars = new List<char>();
// Wraps up an underlying data store
public string Value
{
get { return new String(chars.ToArray()); }
set { chars = new List<char>(value.ToCharArray()); }
}
public void Write(string s) { Write(chars.Count, s); }
public void Write(int index, string s)
{
if (index > chars.Count) { throw new Exception("Out of Range"); }
foreach(char c in s)
{
if (index < chars.Count) { chars[index] = c; }
else { chars.Add(c); }
index++;
}
}
}
公共类字符串缓冲区
{
列表字符=新列表();
//包装底层数据存储
公共字符串值
{
获取{返回新字符串(chars.ToArray());}
set{chars=新列表(value.ToCharArray());}
}
公共无效写入(字符串s){Write(chars.Count,s);}
公共void写入(int索引,字符串s)
{
if(index>chars.Count){抛出新异常(“超出范围”);}
foreach(字符c在s中)
{
如果(索引
Mashesh,
我们都得从某个地方开始!您询问了有关私人VAR与此ex的属性:
private string _testVariable;
public string MyProperty
{
get { return _testVariable;}
set {_testVariable = value;}
}
-or-
public string MyProperty { get; set; }
你是否考虑过:
public string MyProperty { get; private set; }
您可以将作用域应用于属性getter/setter。很酷的东西。哦,是的。在定义类(如构造函数)中使用此类型的属性时,请在其前面加上“this”-这样赋值看起来就像“this.MyProperty=“an Assigned String”;”。这会让你的意图更加清晰 这与C语言无关,更多的是与应用程序有关
使用属性的一个原因是,它在许多框架中被视为“特殊的”。
例如,Silverlight和WPF将绑定到属性而不是字段我讨厌在不需要变量时备份它们,这会导致比必要时更复杂 显然,如果您需要在getter或setter中做一些特殊的事情,那么应该使用完整的语义形式,而不是sugar 此外,我喜欢使用属性作为调试属性如何设置或使用的方法。有时,由于反射的原因,这一点并不明显,这也是我喜欢使用属性的原因之一 我发现,当有可能在类内部通过属性本身或支持变量访问支持变量时,试图调试代码是令人沮丧的,并且没有任何东西告诉程序员正确的访问方式
您可以在内部访问支持变量以及属性,那么哪种方法是正确的?这并不明显…很抱歉,我只是从我的第一个代码片段中复制。。在第二个中忘记删除。。谢谢:)可以问问努布