Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过什么?引用对象还是值类型?_C#_Oop - Fatal编程技术网

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个函数。只需要1
int
的版本和另一个接受2
int
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());
  }
}