相关疑难解决方法(0)

如何从System.Enum转换为基本整数?

我想创建一个泛型方法,用于将任何System.Enum派生类型转换为其对应的整数值,而不进行转换,最好不解析字符串.

例如,我想要的是这样的:

// Trivial example, not actually what I'm doing.
class Converter
{
    int ToInteger(System.Enum anEnum)
    {
        (int)anEnum;
    }
}
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用.Resharper报告您无法将类型为"System.Enum"的表达式转换为"int"类型.

现在我已经提出了这个解决方案,但我宁愿提高效率.

class Converter
{
    int ToInteger(System.Enum anEnum)
    {
        return int.Parse(anEnum.ToString("d"));
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么建议?

c# enums type-conversion

88
推荐指数
4
解决办法
9万
查看次数

为什么我们不能有"char"枚举类型

我想知道为什么我们不能将"char"作为底层枚举类型.因为我们有byte,sbyte,int,uint,long,ulong,short,ushort作为底层枚举类型.二,枚举的默认底层类型是什么?

c# enums char

41
推荐指数
3
解决办法
4万
查看次数

在Dictionary中使用IEqualityComparer与HashCode和Equals()的效率

我认为标题非常清楚.

我在想,如果有使用的时候是有一定效率的开销IEqualityComparerDictionary<K,V>提供一个当这是如何工作的?

谢谢

.net c# performance dictionary

19
推荐指数
3
解决办法
1万
查看次数

拳击和拆箱:什么时候出现?

所以我明白拳击和拆箱是什么.什么时候出现在现实世界的代码中,或者在什么样的例子中出现问题?我无法想象做这样的事情:

int i = 123;
object o = i;           // Boxing
int j = (int)o;     // Unboxing
Run Code Online (Sandbox Code Playgroud)

...但这几乎肯定是极度过于简单的,我甚至可能在之前不知道它的情况下完成了装箱/拆箱.

c# boxing object

14
推荐指数
3
解决办法
6487
查看次数

为什么Enum的HasFlag方法需要拳击?

我正在阅读"C#via CLR"和第380页,有一条说明如下:

注意Enum类定义HasFlag方法,定义如下

public Boolean HasFlag(Enum flag);

使用此方法,您可以重写对Console.WriteLine的调用,如下所示:

Console.WriteLine("Is {0} hidden? {1}", file, attributes.HasFlag(FileAttributes.Hidden));

但是,我建议您出于这个原因避免使用HasFlag方法:

由于它采用了Enum类型的参数,因此传递给它的任何值都必须装箱,需要进行内存分配."

我无法理解这个粗犷的陈述 - 为什么"

您传递给它的任何值都必须装箱

flag参数的类型是Enum,这是一个值类型,为什么会有拳击?"传递给它的任何值必须装箱"应该意味着当你将值类型传递给参数时会发生装箱Enum flag,对吧?

.net c# enums boxing

13
推荐指数
2
解决办法
4201
查看次数

调用ToString()时在结构上装箱

我经常想知道c#中是否真的发生了以下情况

如果我有一个结构但我没有显式覆盖从对象派生的任何方法,如ToString(),GetHashCode()等,那么如果我声明我的struct类的本地实例并调用'ToString()'它,我的struct会被装箱,即CLR会将它隐式转换为堆上的对象,然后调用ToString()吗?或者它是否足够聪明地知道该结构没有实现并忽略它?

public struct Vector2D
{
    public float m_x;
    public float m_y;


    ...... etc
}


void SomeFunc()
{
  Vector2D aVec = new Vector2D();
  Console.WriteLine(aVec.ToString()); // <-- does aVec get boxed here?
  ..... 
}
Run Code Online (Sandbox Code Playgroud)

==编辑 - 更新== Mehrdad 与MSDN链接,虽然有用但让我感到困惑.我会引用,看看是否有人可以为我取消这个

当callvirt方法指令以约束thisType作为前缀时,指令执行如下:

如果thisType是引用类型(而不是值类型),则取消引用ptr并将其作为'this'指针传递给方法的callvirt.

如果thisType是一个值类型而thisType实现了方法,那么ptr将被未修改地传递为调用方法指令的'this'指针,用于通过thisType实现方法.

如果thisType是一个值类型而thisType没有实现方法,则ptr被解除引用,装箱,并作为'this'指针传递给callvirt方法指令.

那么这是否意味着如果我没有在我的结构类型上明确地实现ToString(),它将落入最后一个案例并被装箱?或者我在某处误解了它?

c# performance

12
推荐指数
3
解决办法
4996
查看次数

用例在C#中装箱值类型?

在某些情况下,需要将值类型的实例视为引用类型的实例.对于这种情况,可以通过名为boxing的过程将值类型实例转换为引用类型实例.当盒式化值类型实例时,将在堆上分配存储,并将实例的值复制到该空间中.对此存储的引用放在堆栈上.盒装值是一个对象,一个包含值类型实例内容的引用类型.

了解.NET的通用类型系统

维基百科中有一个Java的例子.但是在C#中,有哪些情况需要打包一个值类型?或者更好/类似的问题是,为什么人们想要在堆上(盒装)而不是堆栈上存储值类型?

c# boxing value-type reference-type cts

10
推荐指数
4
解决办法
6980
查看次数

接口变量是否具有值类型或引用类型语义?

接口变量是否具有值类型或引用类型语义?

接口按类型实现,这些类型是值类型或引用类型.显然,这两个intstring实现IComparable,并且int是一个值类型,并string为引用类型.但是这个怎么样:

IComparable x = 42;
IComparable y = "Hello, World!";
Run Code Online (Sandbox Code Playgroud)

(我试图回答的问题可能被删除了,因为它询问接口是存储在堆栈还是堆中,而且,正如我们都应该知道的那样,考虑到它们之间的值和引用类型之间的差异更具建设性.语义而不是它们的实现.有关讨论,请参阅Eric Lippert的堆栈是一个实现细节.)

.net c# interface value-type reference-type

10
推荐指数
3
解决办法
7652
查看次数

转换为ValueType时的C#boxing

我正在阅读有关ValueType类的内容,我想知道,当某些东西被转换为ValueType时,它是否被盒装了?例:

void DoSomething(ValueType valueType)
{
}

DoSomething(5);
Run Code Online (Sandbox Code Playgroud)

当DoSomething方法收到时,由int文字表示的是否5被包装?

c#

6
推荐指数
1
解决办法
524
查看次数

int没有显式转换的字符串?

我有一个简单的问题,但我很惊讶.

此代码有效:

int itemID = 1;
string dirPath = @"C:\" + itemID + @"\abc";
Run Code Online (Sandbox Code Playgroud)

itemID.ToString()在这种情况下我为什么不这么做?

c# tostring

6
推荐指数
3
解决办法
540
查看次数