c# - 操作对象中数据的正确方法
问题描述
我在一个方法中创建了一个对象,我的意图是将该对象传递给另一个方法,并在传递给它的那个方法中操作对象属性的值。
例如:
void Method1()
{
Person person = new Person();
Method2(person);
Console.WriteLine("Person's age:" + person.age);
}
void Method2(Person p){
p.age = 24;
}
现在我的问题是,这是正确的编程方式吗?或者有更好的方法来做到这一点,记住封装?
解决方案
我相信通过某种外部方法修改对象或让对象通过自己的方法修改自身可能有正当理由。您甚至可以使用两者的某种组合。
在某些外部方法修改对象的情况下,我认为像Builder 模式这样的创建设计模式就是一个完美的例子
- Builder 模式涉及您想要表示的一些对象(
Person
您的案例中的类)和一个实际执行构建所需表示的行为的对象(可能是一个PersonBuilder
类)- 当您要表示的数据涉及更复杂的计算时,此模式是理想的
- Builder 模式涉及您想要表示的一些对象(
在某些对象通过自己的方法修改自身的情况下,我认为某些数据应该在该类内部的对象/类,并且它公开了某些属性(可能通过支持字段)和与该数据交互的方法
- 例如,您可能有一个
Counter
在内部管理计数的类,其中包含您不希望其他类违反的某些规则,因此您需要在类中管理该逻辑并仅公开某些安全的交互
- 例如,您可能有一个
public class Counter
{
private int _count = 0;
public Counter() {}
public int Count
{
// The count can only be retrieved, not modified directly
get { return _count; }
}
// We only allow interaction with our internal count variable through controlled means
public void Increment()
{
++_count;
// We have special logic that we maintain in the Counter class and we don't want to violate it
if (_count > 100) _count = 0;
}
}
说了这么多,蹩脚的答案是这取决于你要解决的问题。但是,您肯定可以使用一些模式和指南来帮助您确定“适合工作的工具”。我建议研究设计模式和SOLID 原则,为您提供一组 C# 开发人员通常遵循的通用指南。
推荐阅读
- batch-file - 如何将命令更改为您自己的命令
- javascript - Bootstrap Slides 在使用 Angular 6 的多项目轮播时滞后
- php - 如何上传管理域中的图像,并将它们保存在另一个域(博客)的图像文件夹中?
- javascript - 映射到 json 并使用 javascript 转换为 html 时得到额外的逗号
- angular - 如何在 Angular 中访问这些信息?
- vba - 使用 Find 和 Offset 检查两个选项卡中的记录
- angular - 为什么我在 AngularJS 中的路由不起作用?
- java - 无法执行构建:LocationAwareException:任务“:app:processDebugGoogleServices”执行失败
- c# - 通过邮件发送超链接会删除超链接
- java - 在OpenGL中将具有变换矩阵的多个网格合并为一个网格