在C#中,int
并且Int32
是同样的事情,但我读了许多那个时代int
优于Int32
没有给出理由.有原因,我应该关心吗?
在看到double.Nan == double.NaN
C#中总是如此虚假之后,我开始好奇如何在引擎盖下实现平等.所以我使用Resharper来反编译Double结构,这是我发现的:
public struct Double : IComparable, IFormattable, IConvertible, IComparable<double>, IEquatable<double>
{
// stuff removed...
public const double NaN = double.NaN;
// more stuff removed...
}
Run Code Online (Sandbox Code Playgroud)
这似乎表明结构Double
声明了一个用这个特殊的小写字母定义的常量double
,尽管我一直认为这两个是完全同义的.更重要的是,如果我使用小写双精度执行实现,Resharper只需将我滚动到文件顶部的声明.同样地,跳转到小写的实现NaN
只是让我在前面的行中进行常量声明!
所以我试图理解这个看似递归的定义.这只是反编译器的人工制品吗?可能是Resharper的限制?或者这个小写的双重实际上是一个完全不同的野兽 - 代表CLR/CTS较低级别的东西?
NaN
真的来自哪里?
这篇MSDN文章涉及数据类型.
它说:
对于Java中的每个原始数据类型,核心类库提供了一个包装类,将其表示为Java对象.例如,Int32类包装int数据类型,Double类包装double数据类型.
另一方面,C#中的所有原始数据类型都是System命名空间中的对象.对于每种数据类型,都提供了短名称或别名.例如,int是System.Int32的短名称,double是System.Double的缩写形式.
我跑到Mono代码来读取System.Int32结构的实现.
我发现了几行强迫我提出这个问题:
public const int MaxValue = 0x7fffffff;
public const int MinValue = -2147483648;
// This field is looked up by name in the runtime
internal int m_value;
Run Code Online (Sandbox Code Playgroud)
我假设MS将以相同的方式实现结构.这与包装器有什么不同吗?文件试图传达的究竟是什么?
如果MSDN被认为是System.Int32结构将无限递归,至少对我来说非常困惑.
为什么在源代码中Int32
使用?在C#中不相等?那么原始的源代码是什么?我糊涂了..int
Int32
int
int
[Serializable]
[System.Runtime.InteropServices.StructLayout(LayoutKind.Sequential)]
[System.Runtime.InteropServices.ComVisible(true)]
#if GENERICS_WORK
public struct Int32 : IComparable, IFormattable, IConvertible
, IComparable<Int32>, IEquatable<Int32>
/// , IArithmetic<Int32>
#else
public struct Int32 : IComparable, IFormattable, IConvertible
#endif
{
internal int m_value; // Here????
public const int MaxValue = 0x7fffffff;
public const int MinValue = unchecked((int)0x80000000);
...
}
Run Code Online (Sandbox Code Playgroud)
之间存在相同的问题Boolean
和bool
太多.
在读了一下Int32
C#中的结构后,我意识到int
并且Int32
是同义词.在struct 的源代码中Int32
,有一个internal int m_value
字段.
如果我的知识是正确的,我们分配给int变量的值存储在m_value
(我是否正确?).但我怀疑的是,m_value
当我们给出时,价值是如何存储的int i = 7;
.
我没有在Int32
struct源代码中看到任何隐式运算符,因此可以存储该值m_value
.
谁能帮我这个?
在查看Int32的源代码,同时做了一些研究,为什么我的DataContractSerializer不会序列化我的结构但是当使用int它工作正常时,我遇到了一些奇怪的代码
public struct Int32 : ...
{
internal int m_value;
public const int MaxValue = 0x7fffffff;
Run Code Online (Sandbox Code Playgroud)
如果Int32和int是别名,为什么在Int32内部声明int?
这是Double中的PositiveInfinity声明.
/// <summary>
/// Represents positive infinity. This field is constant.
/// </summary>
/// <filterpriority>1</filterpriority>
public const double PositiveInfinity = double.PositiveInfinity;
Run Code Online (Sandbox Code Playgroud)
这看起来像一个不会通过编译器的循环...为什么它以这种方式声明?这是如何工作的?