Administrator
发布于 2025-10-10 / 0 阅读
0
0

赋值变量or属性

在C#中,构造函数初始化时应该**优先考虑直接赋值给字段**,但具体选择取决于你的设计需求。以下是详细的比较和建议:

## 1. 直接赋值给字段

```csharp

public class Person

{

private string _name;

private int _age;

public Person(string name, int age)

{

_name = name; // 直接赋值给字段

_age = age; // 直接赋值给字段

}

public string Name => _name; // 只读属性

public int Age => _age; // 只读属性

}

```

## 2. 通过属性赋值

```csharp

public class Person

{

public string Name { get; set; }

public int Age { get; set; }

public Person(string name, int age)

{

Name = name; // 通过属性赋值

Age = age; // 通过属性赋值

}

}

```

## 3. 混合使用(推荐的做法)

```csharp

public class Person

{

private string _name;

private int _age;

public Person(string name, int age)

{

_name = name; // 直接赋值给字段

Age = age; // 通过属性赋值(如果有验证逻辑)

}

public string Name

{

get => _name;

set => _name = value ?? throw new ArgumentNullException(nameof(value));

}

public int Age

{

get => _age;

set

{

if (value < 0 || value > 150)

throw new ArgumentOutOfRangeException(nameof(value));

_age = value;

}

}

}

```

## 最佳实践建议

### ✅ 直接赋值给字段的情况:

- 只读字段readonly

- 没有验证逻辑的简单字段

- 性能敏感的场景

- 内部实现细节

```csharp

public class ImmutablePerson

{

private readonly string _name;

private readonly int _age;

public ImmutablePerson(string name, int age)

{

_name = name; // 必须直接赋值,因为字段是readonly

_age = age;

}

public string Name => _name;

public int Age => _age;

}

```

### ✅ 通过属性赋值的情况:

- 属性包含验证逻辑

- 属性触发事件(如 INotifyPropertyChanged

- 派生类可能重写属性

- 需要保持一致性的业务逻辑

```csharp

public class ObservablePerson : INotifyPropertyChanged

{

private string _name;

public ObservablePerson(string name)

{

Name = name; // 通过属性赋值以触发PropertyChanged事件

}

public string Name

{

get => _name;

set

{

if (_name != value)

{

_name = value;

PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Name)));

}

}

}

public event PropertyChangedEventHandler PropertyChanged;

}

```

## 总结

| 场景 | 推荐方式 | 理由 |

|------|----------|------|

| 不可变对象 | 直接赋值给字段 | 性能好,语义明确 |

| 有验证逻辑 | 通过属性赋值 | 确保数据有效性 |

| 数据绑定 | 通过属性赋值 | 触发变更通知 |

| 简单DTO | 自动属性 | 代码简洁 |

一般原则:在构造函数中,如果没有特殊的业务逻辑需要执行,优先考虑直接赋值给字段以获得更好的性能。如果有验证、事件触发等需求,则通过属性赋值。


评论