我有一个需要自定义数据类型的函数,一种方法 解决这个问题的方法是定义一个结构,但这仅适用于 只是一个功能,如果我只是使用动态,不会更好 对象呢?
例如:
public struct myDataType(){
public string name { get; set; }
public string email { get; set; }
public string token { get; set; }
}
public bool doSomething(string name, string email, string token){
myDataType MDT = new myDataType();
MDT.name = name;
MDT.email = email;
MDT.token = token;
//Do something with MDT
return 1;
}
或 的
public bool doSomething(string name, string email, string token){
dynamic MDT = new ExpandoObject();
MDT.name = name;
MDT.email = email;
MDT.token = token;
//Do something with MDT
return 1;
}
注意:
虽然我可以在结构中定义所有可能的道具,但我不知道我需要使用多少道具。
示例并不真实,它只显示了两种可能的方法。
答案 0 :(得分:2)
这不是dynamic
的目的。如果在运行时之前不知道类型,则使用Dynamic(并且有充分的理由拥有这样的场景)。除此之外的用法只是降低了C#的强类型性质,允许编译在运行时可能无效的代码。
如果您需要具有属性B,C,D的对象A,则创建该对象,即使您打算使用它一次。此外,当某些东西调用您的函数并需要访问返回对象的属性时,您将需要使用该对象。这些属性最好是已知且强类型的。如果您愿意,可以使用结构而不是类,但要使其成为强类型对象。
编辑:编辑原始问题以指示该函数未返回该对象。尽管如此,上述情况仍然适用 - 也就是说,当你在运行时之前不知道类型时,这是不的场景,因此它不正确的场景使用dynamic
。由于对象的使用是短暂的,我会使用struct
。请参阅此处,深入讨论何时应使用struct
:When to use struct?
答案 1 :(得分:0)
如果您选择了您提出的两种解决方案中的任何一种,则不会对性能产生影响。
当编译器满足dynamic
关键字时,它将执行相同的操作,将定义一个包含所有已定义成员的类。
这个例子:
new { Property1 = "something", Propert2 = "somethingElse" }
编译器将生成如下内容:
class SomeNameChoosenByCompiler
{
public string Property1 {get; set; }
public string Property2 {get; set; }
}
因为你实际上在你的方法之外使用对象,所以我会使用struct版本,因为它使代码更易读,易于理解,并且可以及时扩展。
此外,使用dynamic
,您将失去编译时的好处
答案 2 :(得分:0)
你可以这样做。
我个人的偏好是使用强类型结构,这样如果我错误输入任何属性名称,我会在编译项目时找到它。如果您使用expandoobject,则在代码运行之前您将无法找到。
要考虑的另一件事是结构是value type,而expandoobject显然是引用类型。这可能会影响您的决定,因为这两种类型可以在其余代码中使用。例如,值类型变量不能设置为null,并且它们遵循不同的复制语义。
答案 3 :(得分:0)
结构类型的变量实质上是与管道胶带粘在一起的一组变量。结构类型的堆对象(即“盒装”结构实例)由运行时处理,就好像它是一个具有该结构类型的变量作为其唯一字段的类对象;任何在整个结构上运行的方法都在该领域运作,而在结构领域运作的方法则在其子领域运作。
如果将变量用作组,将变量组与胶带绑定在一起的能力非常有用;然而,几乎所有想要这样做的情况都要求结构至少在两个地方使用(例如,它被复制的地方,以及它被复制到的地方),尽管有些情况下所有地方都可能被限制在单个函数中(例如,一个函数可能包含变量prevState
和currentState
,每个变量包含几个字段,并且可能希望能够对{{1}中的所有变量进行快照然后将所有变量还原为它们的早期值)。结构可能对此有利。
我建议有非常简单的结构定义通常很好。如果有一个方法可以读取列表并根据传入的currentState
计算最小值和最大值,则具有结构:
IComparer<T>
可能比使用更复杂的数据类型更清楚,数据类型将其字段包装在属性中并尝试强制执行不变量,例如struct MinMaxResult<T> { public T Minimum, Maximum; }
等。Maximim >= Minimum
是具有公开字段的结构的事实很明显,鉴于声明MinMaxResult
,代码不应期望MinMaxResult mmr;
具有除“写入mmr.Minimum
的最后一个值之外的任何含义,或mmr.Minimum
如果没有写入任何内容。 “所有感兴趣的东西都会出现在对default(T)
的任何写作中; mmr
的定义越简洁,就越不会分散实际情况。