Tag: 引用

Convert.ToBoolean以“0”值失败

我正在尝试将值”0″ ( System.String )转换为其Boolean表示forms,如: var myValue = Convert.ToBoolean(“0”); // throwing an exception here 我查看了MSDN页面 ,在代码示例块中,我找到了这些行: ConvertToBoolean(“0”); // … Unable to convert ‘0’ to a Boolean. 在我的代码中,我正在从System.String转换为Boolean如下所示: // will be OK, but ugly code var myValue = Convert.ToBoolean(Convert.ToInt32(“0”)); 有没有其他方法转换为Boolean类型没有这样丑陋的代码? 为什么会出现这种exception? 因为从引用类型System.String转换为值类型System.Boolean ,但System.Int32也是一个值类型,不是吗?

C#中的字符串赋值

几周前,我发现C#中的字符串被定义为引用类型而不是值类型。 最初我对此感到困惑,但经过一些阅读后,我突然明白为什么将字符串存储在堆而不是堆栈上是很重要的 – 因为将非常大的字符串复制到不可预测的数字上会非常低效堆栈帧。 我完全接受了。 我觉得我的理解几乎已经完成了,但是我缺少一个元素 – 字符串用什么语言来保持它们不变? 用代码示例来说明: string valueA = “FirstValue”; string valueB = valueA; valueA = “AnotherValue”; Assert.AreEqual(“FirstValue”, valueB); // Passes 当我将valueA分配给valueB时,我不明白哪个语言function会复制valueA。 或者,当我将valueA赋值给valueB时,对valueA的引用不会改变,只有valueA在我设置字符串时获得对它自身的新引用。 由于这是一个实例类型,我不明白为什么这样做。 我知道你可以重载,例如,==和!=运算符,但我似乎找不到有关重载=运算符的任何文档。 解释是什么?

.NET项目中的条件引用,有可能摆脱警告吗?

我有两个SQLite程序集的引用,一个用于32位,一个用于64位,看起来像这样(这是一个试图摆脱警告的测试项目,不要挂在路径上) : True ..\..\LVK Libraries\SQLite3\version_1.0.65.0\64-bit\System.Data.SQLite.DLL True ..\..\LVK Libraries\SQLite3\version_1.0.65.0\32-bit\System.Data.SQLite.DLL 这会产生以下警告: Warning 1 The referenced component ‘System.Data.SQLite’ could not be found. 我有可能摆脱这个警告吗? 我开发时只考虑将项目配置为32位的一种方法,让构建机器在构建64位时修复引用,但这看起来有点尴尬,可能容易出错。 还有其他选择吗? 我想摆脱它的原因是警告显然被TeamCity收集并定期标记为我需要调查的东西,所以我想完全摆脱它。 编辑 :根据答案,我试过这个: … ..\..\LVK Libraries\SQLite3\version_1.0.65.0\32-bit … ..\..\LVK Libraries\SQLite3\version_1.0.65.0\32-bit … ..\..\LVK Libraries\SQLite3\version_1.0.65.0\64-bit … ..\..\LVK Libraries\SQLite3\version_1.0.65.0\64-bit 然后在我的参考: False $(SqlitePath)\System.Data.SQLite.DLL 这摆脱了警告,但这是正确的吗?

在检查null时,generics函数是否隐式地将值类型转换为对象?

例如,以下代码演示了我的思路: class Program { static void Main(string[] args) { int i = 0; IsNull(i); // Works fine string s = null; IsNull(s); // Blows up } static void IsNull(T obj) { if (obj == null) throw new NullReferenceException(); } } 还有以下代码: int i = 0; bool b = i == null; // Always false 是否存在隐式对象强制转换? […]

如何在C#中引用事件

我有以下类,它有一个名为LengthChanged公共事件: class Dimension { public int Length { get { return this.length; } set { if (this.length != value) { this.length = value; this.OnLengthChanged (); } } protected virtual void OnLengthChanged() { var handler = this.LengthChanged; if (handler != null) { handler (this, System.EventArgs.Empty); } } public event System.EventHandler LengthChanged; private int length; } 我希望能够在一个名为Observer的方法中注册/取消注册此事件的处理程序,该方法对Dimension类一无所知。 […]

为什么我需要引用一个我没有直接使用的dll?

我有从外部开发人员那里收到的源代码,这个代码分为4种类型的项目:他们的框架,我的项目的环境(让我们称之为“ENV”),应用程序库(称之为“Base”)和应用程序本身(大约20个dll我将统称为“App”)。 现在,我已经为这个混乱添加了另一层,一个名为AdvanceFeatures的dll。 它位于ENV(框架顶部)的正下方。 这个dll只引用框架,ENV引用它。 只有ENV使用这个AdvanceFeatures dll,而Base和App只使用ENV。 我在这里工作的方式是App中的大多数对象都在Base中定义,并在ENV中inheritance/实现类/接口。 这些对象中的一小部分(在App和Base中)从框架本身inheritance/实现类/接口(但这种情况非常罕见)。 除了一个事实,到目前为止一切都很顺利。 编译器要求我将从App中的每个dll和Base中添加对AdvanceFeatures dll的引用。 我没有在ENV之外使用AdvanceFeatures,那么为什么需要这些引用呢? 编辑:我已经为这个问题创建了一个演示项目。 这是项目细节: Assembly: AdvanceFeatures References: Nothing (Reference project-folder is empty) Classes: Decorator, IEnvClass, IDecorator IDecorator contents: namespace AdvanceFeatures { public interface IDecorator { IEnvClass Decorated { get; } void Decorate(); } } IEnvClass contents: namespace AdvanceFeatures { public interface IEnvClass { string Name […]

C#引用赋值运算符?

例如: int x = 1; int y = x; y = 3; Debug.WriteLine(x.ToString()); 是否为任何引用运算符而不是“=”在行:3,使x等于3,如果我指定y = 3。

如何在C#中通过ref传递这个?

在我的一个类(ClassA)中,我想创建另一个类(ClassB)的相关实例,为它提供对启动它创建的对象的引用。 所以我为ClassB提供了一个带有(ref ClassB master)参数的构造错误。 但是在ClassA中,我不能只调用var slave = new ClassB(ref this)。 怎么实现这个?

在方法中传递对派生对象的引用时出错

在c#中我试图实现一个方法,我可以使用它将数据绑定到我传递给它的任何控件(当然,控件是从databoundcontrol对象派生的) 给定方法 public void CTLBindData(ref DataBoundControl ctl){ … } 尝试将派生控件传递给函数时出错 例如以下代码 DropDownList lister = new DropDownList(); CTLBindData(ref lister); 生成转换错误 好的我可以接受,但以下让我困惑(可能是因为我习惯了c ++而不是c#) CTLBindData(ref (DataBoundControl)lister); 在这种情况下,我得到错误“一个ref或out参数必须是一个可赋值变量” 为了澄清,Dropdownlistinheritance自inheritance自DataBoundControl的列表控件 这对我来说没有任何意义我应该能够传递任何从数据绑定控件派生的对象。 似乎显式的类型转换导致了问题。 关于我做错了什么的线索? DC

在C#中,为什么数组上的Equals()方法只比较它们的引用,而不是它们的实际内容

在C# ,为什么Equals()方法总是通过比较引用而不是通过比较内容来检查两个arrays之间的相等性? 因此,所有在其实现中调用Equals()方法(很多)都不能像数组那样工作(它不会比较内容): 示例: int[] array1 = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9}; int[] array2 = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9}; var u = array1.Equals(array1); //true var v = array1.Equals(array2); //false var w = Array.Equals(array1, array2); //false var x = (new List(new int[][] { array1 })).Contains(array2); […]