我在学校里教过C#。我们做了一些基本的事情,例如循环,如果有的话。
现在,我们对OOP做更多的工作。老师对我们说了一些关于自动实现的属性,我觉得这个功能很棒。但是我很好奇如何通过方法设置属性值。
当我们不知道自动实现的属性时。我们总是做一个方法来设置或获取类的值。 但是,当我使用自动实现的属性时,我看不到任何获取或设置类实例的值的方法。因此,当只能通过构造函数设置值时,如何设置类的某些属性的值。我想知道,因为当属性为私有时,我只能通过构造函数设置它,这不是问题,但是当我想通过Console.Readline()设置值时可以做什么。 ?
namespace _001_dedicnost
{
class Car
{
int Size { get; set; }
}
class Program
{
static void Main(string[] args)
{
Car car1 = new Car(5);
// but the following line wont work
car1.Set(51);
}
}
}
答案 0 :(得分:1)
您的Car类具有PRIVATE属性Size,因此您无法从您的代码中访问它,只能从CAR类中访问
如果要为此属性设置值,则必须将其声明为PUBLIC:
class Car
{
public int Size { get; set; }
}
static void Main(string[] args)
{
Car car1 = new Car();
car1.Size = 1;
}
答案 1 :(得分:0)
将属性放在表达式的左侧时,将自动使用表达式的右侧作为值在set方法上调用set方法。
因此car1.Size = 51
就像为value
为51的Size属性调用扩展的setter一样。
答案 2 :(得分:0)
此
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; } }
}
这意味着您“在使用“ =”符号调用的c尖锐编译器下有一对“方法””
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();
的更多信息
我不建议使用它-它破坏了代码的可读性和可读性;(
答案 3 :(得分:0)
如果该类是简单的贫血模型(没有逻辑),请将属性设置为public
,它将起作用。
如果您要控制不变量(业务规则),则希望有一个public Size { get; private set; }
和一个public void SetSize(int size) { /* ... */ }
,其中包含您的业务规则。
以下是C#中通常使用的三种“模式”:
// 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; }
}