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,在设计一个类(在c#或任何oop语言中)时,我总是搞不清楚我应该在一个类中定义属性并在类的方法中使用它,还是简单地使用方法参数好 我在第一种方法中发现的一个问题是,它创建了依赖性(比如,如果调用方忘记将值分配给属性等等,该怎么办) e、 我正在设计一个类“myexcel”,它可以“导出到cvs”、“获取XML”、“格式化excel并保存” 在这里,我应该将“ExcelPath”作为myexcel的属性,还是将其作为参数传递给GetXml、export、format方法?这是一个判断调用。在您的示

在设计一个类(在c#或任何oop语言中)时,我总是搞不清楚我应该在一个类中定义属性并在类的方法中使用它,还是简单地使用方法参数好

我在第一种方法中发现的一个问题是,它创建了依赖性(比如,如果调用方忘记将值分配给属性等等,该怎么办)

e、 我正在设计一个类“myexcel”,它可以“导出到cvs”、“获取XML”、“格式化excel并保存”


在这里,我应该将“ExcelPath”作为myexcel的属性,还是将其作为参数传递给GetXml、export、format方法?

这是一个判断调用。在您的示例中,这取决于您是否希望类型的实例表示文件系统中的特定文件。如果是,则在调用Save但Path无效时引发无效操作异常。如果不是,则需要Save方法的path参数,如果该值无效,则引发无效参数异常


更一般地说,属性应该表示状态,而方法参数应该表示方法所需的信息,但在对象状态之外。

这有点像判断调用。在您的示例中,这取决于您是否希望类型的实例表示文件系统中的特定文件。如果是,则在调用Save但Path无效时引发无效操作异常。如果不是,则需要Save方法的path参数,如果该值无效,则引发无效参数异常


更一般地说,属性应该表示状态,而方法参数应该表示方法所需的信息,但在对象状态之外。

属性应该定义与对象关联的状态,即限定一个实例与另一个实例的状态信息。将对单个函数调用有效的时间信息存储到对象状态是没有意义的。换句话说,如果您将某个对象属性设置为对象属性,因为它在某个方法中使用,那么只有在多个调用中使用相同的属性值,或者该属性在多个方法中使用时,它才有意义


因此,在您的特定情况下,filePath应该是所有save/export方法的参数,因为从使用角度来看,对象实例代表一些数据,而save/export只是序列化数据的一种方式。文件路径仅对该调用有效-它可能会在多次调用中发生更改。

属性应定义与对象关联的状态-限定一个实例与另一个实例的状态信息。将对单个函数调用有效的时间信息存储到对象状态是没有意义的。换句话说,如果您将某个对象属性设置为对象属性,因为它在某个方法中使用,那么只有在多个调用中使用相同的属性值,或者该属性在多个方法中使用时,它才有意义


因此,在您的特定情况下,filePath应该是所有save/export方法的参数,因为从使用角度来看,对象实例代表一些数据,而save/export只是序列化数据的一种方式。文件路径仅对该调用有效-它可能会在多次调用中发生更改。

让我们试试这个小示例

您有一台class
洗衣机
。它的职责是洗衣服

 class WashingMachine
{

       public void WashClothes()
       {

       }

}
现在,您将
衣物列表
设置为属性还是
参数
设置为
洗衣服

如果将其设置为
washwashits
的参数而不是属性,则会很清楚,因为它不定义对象的
状态

除此之外,属性应该便宜,在赋值时不应该抛出异常


希望能有所帮助。

让我们试试这个小例子

您有一台class
洗衣机
。它的职责是洗衣服

 class WashingMachine
{

       public void WashClothes()
       {

       }

}
现在,您将
衣物列表
设置为属性还是
参数
设置为
洗衣服

如果将其设置为
washwashits
的参数而不是属性,则会很清楚,因为它不定义对象的
状态

除此之外,属性应该便宜,在赋值时不应该抛出异常


希望这能有所帮助。

那么,我不会让打电话的人有机会提前知道。这可能意味着myexcel编写器的设计是错误的。该类型的文档通常描述抛出无效操作异常的情况。在这种情况下,您可以实现一个属性或方法,当对象为有效路径时,该属性或方法返回true。比如HasValidPath、PathIsValid或CanSave。那么,我不会让打电话的人提前知道。这可能意味着myexcel编写器的设计是错误的。该类型的文档通常描述抛出无效操作异常的情况。在这种情况下,您可以实现一个属性或方法,当对象为有效路径时,该属性或方法返回true。像HasValidPath、PathIsValid或CanSave.com这样的东西是有意义的。好的,那么myexcel类的属性是什么?取决于实现(以及您是如何建模的)。例如,如果不涉及状态,则可以将其设置为静态(helper)类。所以GetXml/ExportToCSV将是采用excel文件路径和目标路径的静态方法。另外,如果您正在将excel文件读入内存,然后有一些方法可以执行某种操作(例如
AddWorkSheet
)和/或允许浏览信息(
GetWorkSheets
),那么接受excel路径作为构造函数参数并具有相同的只读属性是有意义的。make