0

我有一个需要自定义数据类型的函数,解决此问题的一种方法是定义一个结构,但这仅适用于一个函数,如果我只使用动态对象不是更好吗?

例如:

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;
}

笔记:

  1. 虽然我可以在结构中定义所有可能的道具,但我不知道我需要使用多少。

  2. 该示例不是真实的,它仅显示了两种可能的方法。

4

4 回答 4

2

那不是 的目的dynamic。当您直到运行时才知道类型时使用动态(并且有充分的理由拥有这种情况)。除此之外的用法只会贬低 C# 的强类型特性,允许编译在运行时可能无效的代码。

如果您需要具有属性 B、C、D 的对象 A,则创建该对象,即使您打算使用它一次。此外,当某些东西调用您的函数并需要访问返回对象的属性时,您将需要使用该对象。这些属性最好是已知的并且是强类型的。如果您愿意,可以使用结构而不是类,但要使其成为强类型对象。

编辑:原始问题被编辑以表明该函数不返回对象。尽管如此,上述情况仍然适用——也就是说,这不是一个直到运行时才知道类型的场景,因此它适合使用dynamic. 由于对象的使用是短暂的,我会使用struct. struct有关何时应使用的深入讨论,请参见此处:何时使用结构?

于 2013-10-31T22:37:34.190 回答
0

如果您选择您想出的两种解决方案中的任何一种,则不会影响性能。

当编译器遇到dynamic关键字它会做同样的事情,会定义一个包含所有定义的成员的类。

对于这个例子:

     new { Property1 = "something", Propert2 = "somethingElse" }

编译器会生成类似的东西:

  class SomeNameChoosenByCompiler 
  {
         public string Property1 {get; set; } 

        public string Property2 {get; set; } 
   }

因为您实际上是在方法之外使用对象,所以我会使用 struct 版本,因为它使代码更具可读性和易于理解,并且可能及时扩展。

此外,dynamic你会失去编译时的好处

于 2013-10-31T22:38:33.987 回答
0

无论哪种方式,你都可以做到。

我个人的偏好是使用强类型结构,这样如果我输入错误的任何属性名称,我都会在编译项目时发现。如果您使用 expandoobject,则在代码运行之前您不会发现。

要考虑的另一件事是结构是值类型,而扩展对象显然是引用类型。这可能会影响您的决定,因为这两种类型可以在您的其余代码中使用。例如,值类型变量不能设置为 null,它们遵循不同的复制语义。

于 2013-10-31T22:39:40.863 回答
0

结构类型的变量本质上是一组用胶带粘在一起的变量。结构类型的堆对象(即“装箱”结构实例)由运行时处理,就好像它是具有该结构类型的变量作为其唯一字段的类对象一样;任何对结构作为一个整体进行操作的方法都在该字段上操作,而那些将在结构的字段上操作的方法在其子字段上操作。

如果将变量作为一个组使用,则使用胶带将变量组绑定在一起的能力很有用;然而,几乎所有想要这样做的情况都需要在至少两个地方使用该结构(例如,复制它的地方和复制它的地方),尽管有些情况下所有地方都可能仅限于单个函数(例如,一个可能有一个变量prevStatecurrentState,每个变量包含几个字段,并且可能希望能够对其中的所有变量进行快照,currentState然后将所有变量恢复为其早期值)。结构可能对此有好处。

我建议拥有非常简单的结构定义通常是件好事。如果有一种方法可以读取列表并根据某些传入的值计算最小值和最大值IComparer<T>,则具有以下结构:

struct MinMaxResult<T> { public T Minimum, Maximum; } 

Maximim >= Minimum可以使事情比拥有一个更复杂的数据类型更MinMaxResult清晰除了“写入 的最后一个值,或者没有写入任何内容”之外,还有任何含义。感兴趣的一切都将在写入的任何内容中;的定义越简洁,就越不会分散人们对实际发生的事情的注意力。MinMaxResult mmr;mmr.Minimummmr.Minimumdefault(T)mmrMinMaxResult<T>

于 2013-11-01T15:58:12.507 回答