繁体   English   中英

我应该为一个函数唯一的目的定义一个结构吗?

[英]Should i define a struct for the sole purpose of one function?

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

例如:

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. 示例并不真实,它只显示了两种可能的方法。

这不是dynamic的目的。 如果在运行时之前不知道类型,则使用Dynamic(并且有充分的理由拥有这样的场景)。 除此之外的用法只是降低了C#的强类型性质,允许编译在运行时可能无效的代码。

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

编辑:编辑原始问题以指示该函数不返回该对象。 尽管如此,上述情况仍然适用 - 也就是说,这不是直到运行时才知道类型的情况,因此使用dynamic 不是正确的方案。 由于对象的使用是短暂的,我会使用struct 看到这里进行深入讨论时, struct应使用: 当使用结构?

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

当编译器遇到dynamic关键字时,它将执行相同的操作,将定义一个包含所有已定义成员的类。

对于这个例子:

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

编译器将生成如下内容:

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

        public string Property2 {get; set; } 
   }

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

此外,使用dynamic您将失去编译时的好处

你可以这样做。

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

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

结构类型的变量实质上是与管道胶带粘在一起的一组变量。 结构类型的堆对象(即“盒装”结构实例)由运行时处理,就好像它是一个类对象,该结构类型的变量作为其唯一的字段; 任何在整个结构上运行的方法都在该领域运作,而在结构领域运作的方法则在其子领域运作。

如果将变量用作组,则将变量组与管道磁带绑定在一起的能力非常有用; 然而,几乎所有想要这样做的情况都要求结构至少在两个地方使用(例如,它被复制的地方,以及它被复制到的地方),尽管有些情况下所有地方都可能被限制在单个函数中(例如,一个函数可能有变量prevStatecurrentState ,每个变量包含几个字段,并且可能希望能够获取currentState中所有变量的快照,然后将所有变量恢复为其先前的值) 。 结构可能对此有利。

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

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

可以使事情比使用更复杂的数据类型更清楚,数据类型将其字段包装在属性中并尝试强制执行不变量,例如Maximim >= MinimumMinMaxResult是具有暴露字段的结构的事实清楚地表明给定声明MinMaxResult mmr; ,代码不应该指望mmr.Minimum具有超出“写入mmr.Minimum的最后一个值,或者如果没有写入任何内容则default(T) ”之外的任何含义。 感兴趣的一切都将出现在对mmr任何写作中; MinMaxResult<T>定义越简洁,它就越不会分散实际发生的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM