C# 通过什么?引用对象还是值类型?
伙计们,我有一个“最佳实践问题”,例如,我有以下课程:C# 通过什么?引用对象还是值类型?,c#,oop,C#,Oop,伙计们,我有一个“最佳实践问题”,例如,我有以下课程: class Person { public int age {get; set;} } class Computer { public void checkAge(Person p) // Which one is recommended THIS { // Do smthg with the AGE } public void checkAge(int p) // OR THI
class Person
{
public int age {get; set;}
}
class Computer
{
public void checkAge(Person p) // Which one is recommended THIS
{
// Do smthg with the AGE
}
public void checkAge(int p) // OR THIS
{
//Do smthg with the age.
}
}
建议通过什么?正是我需要的(int值类型)或整个对象(引用类型)
我问这个是因为我在我正在制作的应用程序上使用LINQ,我已经创建了许多实体,我应该在其中传递ID(foreing键),但我传递对象
最好的方法是什么?功能
检查
应该只接收执行其工作所需的最少信息量。添加任何其他内容只会创建一个人工依赖项。如果只需要一个int
,那么这就是我应该采取的解决方案 我认为在这种情况下,答案可能是两者都不是。“年龄”将被分解到它自己的类中,或者如果操作是特定于Person的上下文,它将在Person类中找到。遵循函数的demeter法则。基本上,法律规定实体应该是松散耦合的。问自己以下问题,计算机对象是否应该知道person对象?在这种情况下,可能您在内部检查中所做的只是检查一个int值。如果是这样,那么是什么让您认为需要传递整个对象?在本例中,只需传递person age并将其作为int接受即可
所以我更喜欢
public void checkAge(int n)
根据给出的信息,两种解决方案都不好 第一个解决方案要求计算机课了解人的年龄,没有明显的原因 第二种方法将方法附加到与计算机对象的属性无关的计算机类 一些上下文可能会有所帮助-如果这是一个验证,那么CheckAge属于Person类(可能具有IsAgeAcceptable属性)
为什么电脑要检查一个人的年龄?这个问题的答案决定了什么是合理的…我想指出,当传递引用时,当复制数据类型时,引用是32位整数。因此,如果您的值类型大于32位int,如果性能或内存有任何问题,请通过引用传递。我要指出,
int Age
可能不是存储该值的最佳方式。
(
)
我肯定有人在想,“这个答案的代码太多了,看起来太离谱了”。就像
DateTime.Now
应该是一个方法(因为方法返回的值每次调用都可能更改,而属性通常不应该每次调用都更改值,请参见上面的链接),每个调用的年龄都会更改,所以属性可能应该是Birth。接下来,我将确定年龄的方法封装为一个扩展方法,因为任何可以是IBorn的东西肯定都有一个年龄(忽略某个东西死了的哲学问题,它有一个年龄吗:P)。最后,创建了IDateTimeFactory
对象,这样就可以对Age方法进行单元测试,以确定它是否正确地计算了年龄(否则,硬编码DateTime。现在意味着你无法分辨某个东西与其他东西相比有多大,例如,我的兄弟比我的妹妹大)。优秀的Jared,所以我应该记住给出所需的最小信息。-有时我需要传递2个整数,然后我应该给函数2个整数,依此类推,对吗?@mrferous,我会创建2个函数。只需要1int
的版本和另一个接受2int
s且具有明显不同行为的版本。这一原则被称为德米特定律:+1我一直有这种困惑,不知何故被遗忘,现在它被澄清了。谢谢。这是我一直怀疑的问题类型。我需要问:D@Steven我认为OP只是举个例子。我肯定或者希望他在计算机课上没有真正的校验功能。哈哈哈,伙计们,当然这只是一个例子。我问这个是因为我使用Linq,我需要传递一些ID,但在某些情况下我有3个,所以我决定传递对象。-所以我只传递int。
class Person : IBorn
{
public DateTime Birth {get; set;}
}
interface IBorn
{
DateTime Birth {get; set;}
}
interface IDateTimeFactory
{
DateTime Now();
}
class DefaultDateTimeFactory : IDateTimeFactory
{
public DateTime Now()
{
return DateTime.Now;
}
}
public static class IBornExtensions
{
public TimeSpan AgeFromNow(this IBorn birthed, IDateTimeFactory dtf)
{
return dtf.Now() - birthed.Birth;
}
public TimeSpan AgeFrom(this IBorn birthed, DateTime from)
{
return from - birthed.Birth;
}
}
class Computer
{
public void checkAge(IBorn birthed)
{
var age = birthed.Age((new DefaultDateTimeFactory()).Now());
}
}