我在面试中被问到这个问题:字符串是引用类型还是值类型。我说的是引用类型。然后他问我为什么我们在初始化字符串时不使用new运算符?我说是因为c#语言具有更简单的创建字符串的语法,并且编译器会自动将代码转换为对System.String类的构造函数的调用。这个答案是否正确? 最佳答案 字符串是不可变的引用类型。有ldstr允许将新对象引用推送到字符串文字的IL指令。所以当你写:stringa="abc";编译器测试"abc"文字是否已经在元数据中定义,如果没有则声明它。然后它将这段代码翻译成以下IL指令:ldstr"abc"这基本上使a
我想知道一旦对象的引用被重新分配,对象(在C#中)会发生什么。示例:Carc=newCar("RedCar");c=newCar("BlueCar");由于引用被重用,垃圾收集器是否会在丢失引用后处置/处理“红色汽车”?或者是否需要实现单独的方法来处理“红色汽车”?我想知道的主要是因为我要回收一个相对较大的对象,并且需要知道在重新创建它时是否应该做任何事情。 最佳答案 在您的示例中,当c分配给BlueCar时,c的RedCar实例将有资格进行垃圾回收。您无需执行任何操作。查看这篇关于.NET垃圾收集器的(旧的,但仍然相关的)MSDN
我经常发现自己创建了一个Dictionary具有非平凡的值类(例如List),然后在填充数据时始终编写相同的代码模式。例如:vardict=newDictionary>();stringkey="foo";stringaValueForKey="bar";也就是我想插入"bar"到键"foo"对应的列表中,其中键"foo"可能没有映射到任何东西。这是我使用不断重复的模式的地方:ListkeyValues;if(!dict.TryGetValue(key,outkeyValues))dict.Add(key,keyValues=newList());keyValues.Add(aValu
我正在使用EF6在我的数据库中存储report类的实例。数据库已包含数据。假设我想向report添加一个属性,publicclassreport{//...somepreviousproperties//...newproperty:publicstringnewProperty{get;set;}}现在,如果我转到包管理器控制台并执行add-migrationReport-added-newPropertyupdate-database我将在“/Migrations”文件夹中获取一个文件,将newProperty列添加到表中。这很好用。但是,在数据库中的旧条目上,newPropert
首先,我对此进行了搜索,并在StackOverflow上找到了以下链接:Isthereanydifferencebetween`newobject()`and`new{}`inc#?Differencebetweenobjecta=newDog()vsDoga=newDog()但我对这个答案并不满意,它没有很好地解释(我没有很好地理解)。基本上,我想知道newobject()和new{}之间的区别。它们在编译时和运行时如何处理?其次,我在我的asp.net简单应用程序中将以下代码用于WebMethods[WebMethod][ScriptMethod(UseHttpGet=false)
如果您有一个接口(interface)IFoo和一个类Bar:IFoo,为什么可以执行以下操作:Listfoo=newList();foo.Add(newBar());但是你不能这样做:Listfoo=newList(); 最佳答案 随便看一眼,这似乎应该(就像啤酒应该是免费的一样)有效。然而,快速的健全性检查向我们展示了为什么它不能。请记住,以下代码不会编译。它旨在说明为什么不允许这样做,即使它看起来在某一点之前都没有问题。publicinterfaceIFoo{}publicclassBar:IFoo{}publicclassZ
在C#中,结构是根据值来管理的,而对象是根据引用来管理的。根据我的理解,当创建类的实例时,关键字new导致C#使用类信息来创建实例,如下所示:classMyClass{...}MyClassmc=newMyClass();对于结构,您不是在创建对象,而只是将变量设置为一个值:structMyStruct{publicstringname;}MyStructms;//MyStructms=newMyStruct();ms.name="donkey";我不明白的是,如果通过MyStructms=newMyStruct()声明变量,这里的关键字new对声明做了什么?.如果struct不能是一
我得到了一个要维护的.NET项目。我刚刚浏览了代码,我在属性声明中注意到了这一点:publicnewstringnavUrl{get{return...;}set{...}}我想知道new修饰符对属性有什么作用? 最佳答案 它隐藏了基类的navUrl属性。参见newModifier.如该MSDN条目中所述,您可以使用完全限定名称访问“隐藏”属性:BaseClass.navUrl。滥用任何一种都可能导致大量困惑和可能的精神错乱(即损坏的代码)。 关于c#-"new"c#属性声明中的关键字,
据我所知,有两种复制位图的方法。Bitmap.Clone()BitmapA=newBitmap("somefile.png");BitmapB=(Bitmap)A.Clone();新位图()BitmapA=newBitmap("somefile.png");BitmapB=newBitmap(A);这些方法有何不同?我对内存和线程方面的差异特别感兴趣。 最佳答案 阅读之前的答案,我担心像素数据会在位图的克隆实例之间共享。所以我进行了一些测试以找出Bitmap.Clone()和newBitmap()之间的区别。Bitmap.Clone
在类层次结构中定义方法时,C#中的override和new关键字有什么区别? 最佳答案 下一页很好地总结了您的问题。KnowingWhentoUseOverrideandNewKeywords总结覆盖:当基类的方法在派生类中被覆盖时,将使用派生类中的版本,即使调用代码“不知道”该对象是派生类的实例。New:如果您使用new关键字而不是override,派生类中的方法不会覆盖基类中的方法,它只是隐藏它。如果您既没有指定new也没有指定overrides,生成的输出与您指定new时的结果相同,但您还会收到编译器警告(因为您可能不知道您隐