C# 统一封装,属性强制我重写变量名?
我想了解一件简单的事情 我读了很多关于用Unity和C封装的问题和答案。 这都是关于get/set的,大多数答案都是这样的 get和set的最大好处是停止输入错误或我在任何其他脚本中编写的东西,以访问我的变量并为我的程序制造问题 所以,如果我真的很专注,并且没有犯像get/set变为null这样的错误!我的意思是,没有其他真正的好处 而且,我看到这个属性迫使我重写变量名,太多了 像这样:C# 统一封装,属性强制我重写变量名?,c#,unity3d,encapsulation,C#,Unity3d,Encapsulation,我想了解一件简单的事情 我读了很多关于用Unity和C封装的问题和答案。 这都是关于get/set的,大多数答案都是这样的 get和set的最大好处是停止输入错误或我在任何其他脚本中编写的东西,以访问我的变量并为我的程序制造问题 所以,如果我真的很专注,并且没有犯像get/set变为null这样的错误!我的意思是,没有其他真正的好处 而且,我看到这个属性迫使我重写变量名,太多了 像这样: private int health public int health { get; private s
private int health
public int health { get; private set; }
因此,结果是我生成了更复杂的代码。我在剧本中用了更多相同的名字,这不危险吗 您的示例不起作用,因为健康状况是同一变量的两倍。常用的约定是对支持字段使用_health或health,对属性get/set/使用health。此外,没有什么可以阻止你做:
private int backingField;
public int OtherProperty { get { return backingField; } }
public int Property => backingField; // Does same thing as above
这对你、你未来的自己和你的同事来说都是非常混乱的
但是,在您的情况下,您可以这样做:
public int Health { get; private set; }
所以,如果我真的专注并且没有犯错误
这是一种非常糟糕的心态。如果你坚持这样的心态,你会朝自己的脚开枪,因为你不能同时专注于每件事。大脑一次只能加载这么多信息。这样做是为了不让自己犯错误
我的程序员教授曾经说过,这种心态就像把你的孩子留在高速公路的一条车道上,如果有车来了,你就把它开到另一条车道上。你可以永远这样做,或者你不能在高速公路附近生孩子
VisualStudio使重命名东西变得非常容易,您只需执行一次即可。get/set的更好功能是确保数据有效。比如说
private int _age = 0;
public int Age
{
get => _age;
set
{
if (value > 0)
_age = value;
}
}
此代码将防止用户将年龄设置为负数,因为这是不可能的
房产令人惊叹,你可以用它们做很多很酷的事情,比如:
public struct Rectangle
{
public int X, Y;
public int Area => X * Y;
public Rectangle(int x, int y) => (X, Y) = (x, y);
}
公共内部区域=>X*Y;是一种财产,虽然看起来不像。这与:
public int Area
{
get
{
return X * Y;
}
}
很酷的是,这个区域只有一个getter,所以它的值不能改变。面积=3不起作用。这是理想的,因为这会使数据无效
实际上,对于方法GetArea=>X*Y;,所有区域都是语法糖;,但是我们没有在结尾使用Get前缀或
属性什么时候有用
总之,属性get/set有助于将变量的设置设置为私有或受保护,以防止无效数据泄漏进来,在使用setter确保新数据有效时引发一些问题,或者具有一些看起来像只读变量但实际上执行快速计算以获取数据的问题
从这个意义上讲,它们非常适合封装
编辑:正如Draco18s所指出的,它们对于接口也很有用,接口类似于类,但区别之一是它们不能有字段。但是,它们可以有属性,因为在引擎盖下,属性只是方法。您的示例不起作用,因为健康状况是同一变量的两倍。常用的约定是对支持字段使用_health或health,对属性get/set/使用health。此外,没有什么可以阻止你做:
private int backingField;
public int OtherProperty { get { return backingField; } }
public int Property => backingField; // Does same thing as above
这对你、你未来的自己和你的同事来说都是非常混乱的
但是,在您的情况下,您可以这样做:
public int Health { get; private set; }
所以,如果我真的专注并且没有犯错误
这是一种非常糟糕的心态。如果你坚持这样的心态,你会朝自己的脚开枪,因为你不能同时专注于每件事。大脑一次只能加载这么多信息。这样做是为了不让自己犯错误
我的程序员教授曾经说过,这种心态就像把你的孩子留在高速公路的一条车道上,如果有车来了,你就把它开到另一条车道上。你可以永远这样做,或者你不能在高速公路附近生孩子
VisualStudio使重命名东西变得非常容易,您只需执行一次即可。get/set的更好功能是确保数据有效。比如说
private int _age = 0;
public int Age
{
get => _age;
set
{
if (value > 0)
_age = value;
}
}
此代码将防止用户将年龄设置为负数,因为这是不可能的
房产令人惊叹,你可以用它们做很多很酷的事情,比如:
public struct Rectangle
{
public int X, Y;
public int Area => X * Y;
public Rectangle(int x, int y) => (X, Y) = (x, y);
}
公共内部区域=>X*Y;是一种财产,虽然看起来不像。这与:
public int Area
{
get
{
return X * Y;
}
}
很酷的是,这个区域只有一个getter,所以它的值不能改变。面积=3不起作用。这是理想的,因为这会使数据无效
实际上,对于方法GetArea=>X*Y;,所有区域都是语法糖;,但是我们没有在结尾使用Get前缀或
属性什么时候有用
总之,属性get/set对于设置
变量private或protected的g,以防止无效数据泄漏进来,当使用setter确保新数据有效时,会触发某些事件,或者具有看起来像只读变量但实际上执行快速计算以获取数据的事件
从这个意义上讲,它们非常适合封装
编辑:正如Draco18s所指出的,它们对于接口也很有用,接口类似于类,但区别之一是它们不能有字段。但是,它们可以有属性,因为在后台,属性只是方法。通常,属性值名称将以大写字母书写。这片土地将是
小写
通常,字段设置为私有,供类使用
属性将在编译代码时转换为Get和Setvalue方法
private int _health
public int Health { get; private set; }
通常,属性值名称将以大写字母书写。这片土地将是
小写
通常,字段设置为私有,供类使用
属性将在编译代码时转换为Get和Setvalue方法
private int _health
public int Health { get; private set; }
当您需要一个接口来声明一个字段时,这也很好。它不能,但它可以声明属性!当您需要一个接口来声明一个字段时,这也很好。它不能,但它可以声明属性!