【问题标题】:Is there a test to see if unknown object is of a value type? [closed]是否有测试来查看未知对象是否属于值类型? [关闭]
【发布时间】:2015-05-08 21:53:29
【问题描述】:

我正在使用的Value Type 的定义。

如果我得到一个对象成员

class SampleClass{

    object SampleMember{ get; set; }
}

并将其设置在一个函数中...

public SampleClass foo(SampleClass bar){

      bar.SampleMember = 6m;
      return bar;
}

并且需要在另一个中测试它;测试需要知道它是引用类型还是值类型(在本例中为十进制)。

public SampleClass blick(SampleClass spok){

    if( TestUtilities.IsAValueType(bar.SampleMember) )
    {
        DoBlickWorkOnSpok(spok)
    }
    return spok;
}

在 spok 上可以做什么样的测试来测试它是否是一个值类型?

【问题讨论】:

  • @Servy Primitive Types aka 预定义类型或内置类型,请查看:msdn.microsoft.com/en-us/library/aa711900%28v=vs.71%29.aspx
  • @chomba 鉴于上下文,我认为 OP 实际上并不是指内置类型,但如果他是,他应该使用该术语,因为如果他这样做了,那么问题将是可回答的,因为这是一个定义明确的术语。您链接到的内容在 VB.NET 规范中,并且特定于该语言。该列表中的类型也将不同于 C# 中的内置类型,这就是为什么使用正确的术语很重要;它改变了含义。
  • @Servy FWIW 语言规范在介绍中将 intdouble 称为原始类型,但您说得对,它不是正式的定义。
  • 仅供参考,显然内置类型和原始类型不一样看看这个答案:“Primitive types” versus “built-in value types”
  • 很公平 - 我会更新问题以使其更清楚。我问错问题了。很抱歉。

标签: c#


【解决方案1】:

尝试:

bar.SampleMember.GetType().IsPrimitive

在您的示例中,您特别提到了“十进制”Microsoft 没有将十进制定义为原语。如果您还检查它是否特别是小数,除了IsPrimitive 可能会为您提供所需的内容:

bar.SampleMember.GetType().IsPrimitive || bar.SampleMember is decimal

【讨论】:

  • 您对原语的定义似乎与 OP 的定义相冲突。 (这并不奇怪,因为该术语通常有许多不同的定义,而 C# 并没有为该语言定义一个。)
  • @Servy Microsoft 将其定义为:“原始类型为 Boolean、Byte、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64、IntPtr、UIntPtr、Char、Double 和 Single。”根据 IsPrimitive。但是,OP确实提到了十进制。十进制不包括在该列表中。我会更新我的答案
  • @dman2306 这就是 CLR 对“原语”的定义。考虑到他的问题,OP 似乎并没有在寻找那个。
  • @dman2306 你不知道他想要什么,因为这个问题至少有六种不同的解读。相当接近但微妙地离开很可能比根本没有答案更糟糕。有一个看似正确的错误答案是非常有害的。在许多不同的选项中盲目猜测不仅浪费时间,而且是有害的。 OP需要澄清他实际要求的内容。只是从帽子中挑选一些随机选项来回答是没有帮助的。
  • @Servy。我不同意。鉴于 OP 没有定义“原始”,我认为使用 CLR 提供的定义是合适的。词是有含义的。如果有人没有提供他们希望使用的特定定义,那么使用标准定义是正确的。仅仅因为你不相信微软对原语的定义并不会使他们的定义出错。将这个答案称为“积极有害”似乎是不恰当的,因为 StackOverflow 不仅仅是一个问答论坛,它还是一个学习和讨论论坛。我敢打赌,有些人读过这篇文章但不知道 IsPrimitive 的存在。
【解决方案2】:

C# 中没有基本类型的任何定义。所有类型都继承System.Object,它们分为两类,reference 类型和value 类型。

上图取自C#语言规范版本5。

【讨论】:

  • 好吧,我不会说原始类型没有“概念”——.NET Framework 本身将某些类型标识为原始类型——但对于 C# 特有的“原始”类型没有单一定义(stringdecimal 不是框架定义的原始类型)。
  • @DStanley 在该上下文中没有原始类型的 unifiedclear 概念。人们在使用这个词时,有很多微妙甚至完全不同的意思。为了回答有关它的问题,“大量不一致的概念”非常接近“没有概念”。
  • @DStanley 我同意你的看法。这实际上是我的意图,说C# 中没有任何原始类型的概念。我没有提到 .NET 框架,因为在这种情况下存在某些原始类型。此外,我第一次尝试在 C# 语言规范中搜索原始术语,但没有找到任何东西。感谢您的评论。
  • @Servy 我同意,但我仍然认为“没有定义”比“没有概念”更接近真相。
  • @DStanley 我将术语“概念”改为“定义”,希望不会造成任何问题。
【解决方案3】:

可以确定原始类型 如:

var p = 0; bool result = p.GetType().IsPrimitive

值类型可以确定

作为:

     var a = 0;
     bool x = a is System.ValueType;

//在这种情况下x = true

也是编译器定义了它的原始类型。

CLR 仅将类型理解为值类型或引用类型。

【讨论】:

  • 为什么将“原始类型”等同于值类型?你会认为一些struct ExtremelyComplicatedMess { /* 1000 properties go here */ } 是“原始类型”吗? OP会吗?事实是,OP 还没有说明(到目前为止)他认为什么是原始类型(除了 decimal 是其中之一),所以这实际上只不过是在黑暗中猜测而已。
  • @stakx 好吧,在这个问题的情况下,他想知道它是“原始类型还是引用类型”,意思是其中一个;只有当“原始”是指“价值类型”时,这才有意义。但这仍然是一个非常不稳定的论点。从根本上说,这个问题是不清楚的,不幸的是,人们选择在飞镖板上盲目地扔飞镖,而不是把不明确的问题当作不清楚来结束。
  • @Servy:“不幸的是,人们选择在飞镖板上盲目地投掷飞镖,而不是把不明确的问题当作不明确来结束”。说得好。这正是我在上面的评论中想要暗示的。
  • @stakx 明白了你关于回答一个不完整问题的观点,无论如何我对 *primitive 类型的回答是不正确的。会改正的
  • 尽管问题不清楚,但我还是给出了这个答案,因为他无论如何都涵盖了所有基础,而不是为各种可能的含义争吵,而是为我措辞不佳的 OP 提供了其他可能的合理答案途径。
猜你喜欢
  • 1970-01-01
  • 2010-11-02
  • 2023-04-09
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 2014-01-20
相关资源
最近更新 更多