Tag: 引用

C#:在什么情况下你应该删除引用?

CLR Profiler还可以显示哪些方法分配的存储空间超出了您的预期,并且可以发现无意中保留对无用的对象图的引用的情况,否则这些对象图可能被GC回收。 (一个常见的问题设计模式是一个软件缓存或项目的查找表,这些项目不再需要或以后可以安全重建。当缓存使对象图表保持活动超过其使用寿命时,这是悲剧性的。相反,请确保将参考文献归零到你不再需要的对象 。) – 编写更快的托管代码 我认为我之前没有真正搞过一个参考。 我假设你并不总是需要这样做,但我想也有时候记得这么做很重要。 但是,那是什么情况呢? 什么时候应该删除引用?

类VS ref Struct

我正在使用C#编写游戏,因此,我非常关注性能。 我想知道主要区别是什么,如果可能的话,使用Class传递数据或通过引用传递的struct的性能考虑因素。 出于性能原因,我希望不要复制数据(我假设通过ref传递比这里的值快得多)。 我知道一个类总是通过引用传递,并且结构是通过值传递的,但我在谈论通过引用传递结构。 我希望传递的数据示例: public delegate void PathCompleteDelegate(List path); public struct PathFinderJob{ public PathCompleteDelegate callback; public Vector3 start, end; public PathSize unitSize; public BoxCollider boxCollider; } 在前面的例子中,使用类会有所作为吗? 如果是这样,差异会是什么? 在这个例子中,一个类是否比结构更快? 为什么? 谢谢。 若昂卡洛斯

制表符分隔文件中的引号

我有一个简单的应用程序打开制表符分隔的文本文件,并将该数据插入数据库。 我正在使用这个CSV阅读器来读取数据: http : //www.codeproject.com/KB/database/CsvReader.aspx 这一切都很好! 现在我的客户端在文件的末尾添加了一个新字段,即“ClaimDescription”,在其中一些声明描述中,数据中包含引号,例如: “SUMISEI MARU NO 2” – 日本海 这似乎是我的应用程序的一个主要问题。 我得到一个exception,看起来像这样: 在位于’181’的记录’1470’字段’26附近,CSV似乎已损坏。 目前的原始数据:…… 在那个“原始数据”中,索赔说明字段确实显示带有引号的数据。 我想知道以前有没有人遇到过这个问题,并绕过它? 显然,我可以要求客户端更改他们最初发送给我的数据,但这是一个自动化过程,用于生成制表符分隔文件; 我宁愿把它作为最后的手段。 我以为我可以手动使用标准的TextReader打开文件,转义任何引号,将内容写回新文件,然后将该文件输入CSV阅读器。 值得一提的是,这些制表符分隔文件的平均文件大小约为40MB。 任何帮助是极大的赞赏! 干杯,肖恩

添加实例以引用另一个实例中的字段

对不起,这个问题可能以不同的forms存在,但我真的在各处搜索,看不到它。 我曾在C ++工作,习惯了指针。 我用C#模拟代码替换我的逻辑时遇到问题。 这是我的C#代码: class Parent { public Parent A { get; set; } public Parent B { get; set; } } static void Main(string[] args) { Parent P1 = new Parent(); Parent X = new Parent(); Parent[] array = new Parent[10]; array[0] = P1; array[1] = P1.A; array[2] = P1.B; array[1]= X; //I […]

如何获取可变字符串列表?

我有以下代码 List l = new List(); String s = “hello”; l.Add(s); s = “world”; 当我设置一些断点并完成程序时,在执行最后一行之后,列表中的值仍然是hello而不是world 。 它不应该等于world吗? 字符串不是一个对象,我不只是将一个指针插入列表中吗? 稍后如果我将字符串更改为指向不同的值(“world”),为什么我的列表仍然引用旧值? 我怎样才能达到理想的效果? 非常感谢!

即使我引用了System.XML,也找不到XmlDocument类型?

我引用了System.Xml: using System.Xml; 然后在这一行: XmlDocument xdoc = new XmlDocument(); 我明白了: 找不到类型或命名空间名称“XmlDocument” 什么可能有错? 信息: .NET 3.5,C#,三重检查它被引用并在同一文档中使用,能够使用类似甚至子库(System.Linq; System.Xml.Linq; System.Xml.XPath; System.Xml;)

BinaryReader.Dispose(bool disposing)创建一个对stream的本地引用。 为什么?

我在FCL代码中发现了一个不寻常的样本。 这是System.IO.BinaryReader中的方法: protected virtual void Dispose(bool disposing) { if (disposing) { Stream copyOfStream = m_stream; m_stream = null; if (copyOfStream != null && !m_leaveOpen) copyOfStream.Close(); } m_stream = null; m_buffer = null; m_decoder = null; m_charBytes = null; m_singleChar = null; m_charBuffer = null; } “copyOfStream”对执行逻辑有什么影响?

在扩展方法中保留状态

C#团队之前曾考虑过向C#添加扩展属性,事件等。 Per Eric Lippert: http://blogs.msdn.com/b/ericlippert/archive/2009/10/05/why-no-extension-properties.aspx 然而,为了使这些特征有用,它们必须能够用对象存储一些新的状态。 看起来这样做的唯一方法是使用字典并将对象的每个实例与其他状态相关联。 如果可以通过创建我自己的字典(以及可能的get / set扩展方法)“手动”复制此function将是有用的。 但是,为了将对象的特定实例与某个状态相关联,您需要散列对该对象的实际引用 。 在另一种语言中,您可以通过散列其内存位置来实现此目的,但是在C#中不能保证保持不变,并且使用不安全的代码来完成此function远非理想。 有没有人知道是否有可能获得一些对象的可引用引用,该对象在对象的内部状态发生变化时不会改变? 显然有一些内部机制可以跟踪单个对象而不管它们的内存位置如何,但我不确定它是否暴露给用户代码。 注意:简单地散列对象本身根本不起作用,因为GetHashCode()依赖于对象的内部状态而不是它所在的对象 。 感谢您的任何见解。

我能否检测到我是否已将新对象作为参数?

精简版 对于那些没有时间阅读我对以下问题的推理的人: 有没有办法为方法的参数强制实施“仅新对象”或“仅现有对象”的策略 ? 长版 有很多方法将对象作为参数,并且方法是否具有对象“all to their”并不重要。 例如: var people = new List(); Person bob = new Person(“Bob”); people.Add(bob); people.Add(new Person(“Larry”)); 这里List.Add方法采用了“现有” Person (Bob)以及“new” Person (Larry),该列表包含两个项目。 Bob可以作为bob或people[0] 。 拉里可以作为people[1]访问,如果需要,可以随后缓存和访问larry (或其他)。 好的。 但有时一个方法确实不应该传递给新对象。 以Array.Sort为例。 以下内容并没有多大意义: Array.Sort(new int[] {5, 6, 3, 7, 2, 1}); 所有上面的代码都是采用一个新数组,对它进行排序,然后忘记它(因为它的引用计数在Array.Sort退出后达到零,因此排序的数组将被垃圾收集,如果我没有记错的话) 。 因此Array.Sort 期望 “现有”数组作为其参数。 可以想象其他方法可能期望 “新”对象(尽管我通常认为这样的期望会是设计错误)。 一个不完美的例子是: DataTable firstTable = myDataSet.Tables[“FirstTable”]; […]

我该如何排除故障:System.TypeLoadException?

你能给我一个解决System.TypeLoadException问题的方法吗? 我对我的解决方案中的现有项目有exception,我在同一解决方案中从unit testing项目中引用。 当我运行unit testing时抛出此exception。 他们因为这个例外而失败: 细节: 测试方法MyErrorHandler.Test.MyTest.Parse_RecievesValidMessage_ReturnsArray引发exception:System.TypeLoadException:无法从程序集’MyTestAssemblyName.Test,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = Somenumber加载类型’MyTestNameSpace’。 我应该检查什么或在哪里开始调查?