我意识到它似乎是C#中字段和属性之间有什么区别的重复?但我的问题略有不同(从我的观点来看):
一旦我知道了
是否有任何区别(风格/未来发展除外),如设置属性时的某种控制类型?
是否有任何额外的区别:
public string MyString { get; set; }
Run Code Online (Sandbox Code Playgroud)
和
public string myString;
Run Code Online (Sandbox Code Playgroud)
(我知道,第一个版本需要C#3.0或更高版本,并且编译器会创建私有字段.)
我无法理解为什么C#3.0中存在自动实现的属性语言功能.
你说的时候有什么不同
public string FirstName;
Run Code Online (Sandbox Code Playgroud)
比
public string FirstName { get; set; }
Run Code Online (Sandbox Code Playgroud) 在某些情况下,我在我的类顶部声明成员变量,然后声明一个属性来访问或设置该成员变量,但我问自己,如果该变量只是从内部进行访问和设置,那么该属性是否必要这个类而不是其他,所以使用属性访问和设置成员变量的优点是什么,而不是直接对成员变量本身进行操作.这是一个例子:
public class Car
{
int speed; //Is this sufficient enough if Car will only set and get it.
public Car(int initialSpeed)
{
speed = initialSpeed;
}
//Is this actually necessary, is it only for setting and getting the member
//variable or does it add some benefit to it, such as caching and if so,
//how does caching work with properties.
public int Speed
{
get{return speed;}
set{speed = value;}
}
//Which is better?
public void MultiplySpeed(int multiply)
{
speed …Run Code Online (Sandbox Code Playgroud) 可能重复:
C#中属性和变量的区别是什么
几个星期前我开始使用C#,这真的让我烦恼.C#允许这些所谓的"魔术"吸气剂和固定剂,也称为"语法糖".所以,我可以这样做:
public int myInt { get; set; }
但从封装的角度来看,这是毫无意义的.首先,数据成员是公共的,我可以使用点运算符来获取/设置它.但是,如果我这样做:
private int myInt { get; set; }
我根本无法访问它myInt is inaccessible due to protection level.这是什么实际上是在做什么?我认为这应该是完成数据封装的简单方法,所以我不必这样做:
private int myInt;
public void setMyInt(int i) { myInt = i; }
public int getMyInt() { return myInt; }
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.就像我所知,我只是将这些变量公之于众.我想也许我可以做类似的事情
public int myInt { get; }
所以客户端可以get,但不是set,但不是,仍然允许公共访问.什么给出了什么?
编辑 我不是要做任何具体的事情,我只是想了解这实际上是如何工作的.澄清:
使变量public不能完成封装,特别是当我可以使用点运算符访问它时.为private变量编写getter和setter 允许您对变量进行更改,但可以更好地控制实际发生的变化.
我想说我正在用简单的编码学习语言.
如果我创建一个对象ResourceTemplate作为
public class ResourceTemplate
{
public string Name;
public int Value;
}
Run Code Online (Sandbox Code Playgroud)
然后做了
List<ResourceTemplate> resource = new List<ResourceTemplate>();
Run Code Online (Sandbox Code Playgroud)
该资源将是一个具有结构的列表ResourceTemplate.如果是这样,为什么我不能使用 resource.Add("product", 500);?
编译器说它不能对ResourceTemplate函数进行重载.