C# 如何通过setter设置属性
我在学校里学过C。我们做了一些基本的事情,比如循环,if等等 现在我们做更多关于OOP的事情。老师给我们讲了一些关于自动实现属性的内容,我发现这个特性非常棒。但我很好奇如何通过方法设置属性的值 当我们不知道自动实现的属性时。我们总是使用一种方法来设置或获取类的值。 但当我使用自动实现的属性时,我并没有看到任何方法来获取或设置类实例的值。所以,当我只能通过构造函数设置值时,如何设置类的某些属性的值呢。我想知道这一点,因为当属性是私有的时,我只能通过构造函数来设置它,这不是问题,但当我想通过Console.Readline()设置值时,我能做什么C# 如何通过setter设置属性,c#,C#,我在学校里学过C。我们做了一些基本的事情,比如循环,if等等 现在我们做更多关于OOP的事情。老师给我们讲了一些关于自动实现属性的内容,我发现这个特性非常棒。但我很好奇如何通过方法设置属性的值 当我们不知道自动实现的属性时。我们总是使用一种方法来设置或获取类的值。 但当我使用自动实现的属性时,我并没有看到任何方法来获取或设置类实例的值。所以,当我只能通过构造函数设置值时,如何设置类的某些属性的值呢。我想知道这一点,因为当属性是私有的时,我只能通过构造函数来设置它,这不是问题,但当我想通过Cons
将属性放置在表达式的左侧时,将自动对其调用set方法,并将表达式的右侧作为值
因此
car1.Size=51
就像调用Size属性的扩展setter,而value
为51。您的class Car具有私有属性Size,因此您不能从代码访问它,只能从class Car访问
如果要设置此属性的值,必须将其声明为公共:
class Car
{
public int Size { get; set; }
}
static void Main(string[] args)
{
Car car1 = new Car();
car1.Size = 1;
}
这个
等同于以下声明:
public class Point {
private int __x = 0;
public int X { get { return __x; } set { __x = value; } }
}
这意味着您在c sharp编译器下有“两个方法”,它们使用“=”符号调用
了解有关自动属性的更多信息
顺便说一句,我不建议使用它——它破坏了代码的可读性和可重构性;(如果该类是一个简单的贫血模型(没有逻辑),请将属性设置为
public
,它将工作
如果您想要控制不变量(业务规则),您需要一个public Size{get;private set;}
和一个public void SetSize(int Size){/*…*/}
来包含您的业务规则
以下是C#中通常使用的三种“模式”:
//贫血域模型(简单实体)
公车
{
公共整数大小{get;set;}
}
//具有业务规则的域模型
公车
{
公共整数大小{get;私有集;}
公共无效设置大小(整型大小)
{
//检查以确保大小在约束范围内
如果(尺寸<0 | |尺寸>100)
抛出新ArgumentException(nameof(size));
大小=大小;
}
}
//价值对象
公车
{
公共汽车(国际规格)
{
//检查大小限制
大小=大小;
}
公共整数大小{get;}
}
car1.Size=51;
应该可以工作。这就像设置一个字段一样。您还需要将Size
设置为公共,这应该可以工作,但当Size为私有时不应该工作。如果Size`应该是私有的,您不应该从外部访问它。
public class Point {
public int X { get; set; } = 0;
}
public class Point {
private int __x = 0;
public int X { get { return __x; } set { __x = value; } }
}
Point p = new Point();
p.X = 10; //c# compiler would call something like p.__set_X(10)
int i = p.X; //c# compiler would call something like int i = p.__get_X();
// Anemic domain model (simple entity)
public class Car
{
public int Size { get; set;}
}
// Domain model with business rules
public class Car
{
public int Size { get; private set; }
public void SetSize (int size)
{
// check to make sure size is within constraints
if (size < 0 || size > 100)
throw new ArgumentException(nameof(size));
Size = size;
}
}
// Value object
public class Car
{
public Car (int size)
{
// check constraints of size
Size = size;
}
public int Size { get; }
}