为什么在C#中引用和退出?

使用关键字ref ,调用代码需要初始化传递的参数,但是使用关键字out我们不需要这样做。 为什么我们out到处都用? 这两者之间有什么区别? 请举例说明我们需要使用ref并且不能使用的out ?

正则表达式花了很长时间

我有一个用户输入的搜索字符串。 通常,使用空格分割搜索字符串,然后执行OR搜索(如果项匹配任何搜索字符串元素,则匹配项)。 我想提供一些“高级”查询function,例如使用引号括起包含空格的文字短语的function。 虽然我已经敲定了一个像样的正则表达式来为我分割字符串,但它执行的时间非常长(在我的机器上> 2秒)。 我把它弄清楚了解打嗝的位置,更有趣的是它似乎在最后一场Match匹配后发生(可能是在输入结束时)。 直到字符串结尾的所有匹配在更短的时间内匹配然后我可以捕获,但是最后一个匹配(如果它是什么 – 没有返回)几乎占用了所有的2秒。 我希望有人可能会对我如何加速这个正则表达式有所了解。 我知道我正在使用一个无限量词的lookbehind但是,正如我所说,这似乎不会导致任何性能问题,直到最后一场比赛匹配。 码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; namespace RegexSandboxCSharp { class Program { static void Main( string[] args ) { string l_input1 = “# one \”two three\” four five:\”six seven\” eight \”nine ten\””; string l_pattern = @”(?<=^([^""]*([""][^""]*[""])?)*)\s+"; Regex l_regex = […]

.net持久资源管理器,用于事务性文件系统访问

我试图围绕在C#中使用System.Transactions命名空间。 我在MSDN上找到了一些关于使用资源管理器的文档,但它只包含任何细节的易失性内存资源管理器(如Transactional)。 我基本上在寻找可以在TransactionScope中使用的东西,就像Transactional 一样,但是用它来写入/修改/删除磁盘上的文件。 标准库中是否存在类似的内容? 我已经读过NTFS现在有“TxF”允许事务性文件系统访问 – 我期待在.net中找到一些利用它的东西。 也许我需要实现自己的?

从async / await方法返回列表

我想以异步方式提出Web服务请求。 我在这里称呼它: List list = GetListAsync(); 这是我的函数的声明,它应该返回一个列表: private async Task<List> GetListAsync(){ List list = await Task.Run(() => manager.GetList()); return list; } 如果我想编译我得到以下错误 Cannot implicitely convert type System.Threading.Tasks.Task<System.Collections.Generic.List> to System.Collections.Generic.List 据我所知,如果我使用async修饰符,结果会自动包含在Task中。 我认为这不会发生,因为我使用Task.Run 。 如果我删除Task.Run(() =>部分我得到 无法等待System.Collections.Generic.List表达式 我想我还没有完全理解async / await方法。 我做错了什么?

将List添加到List 作为IList抛出exception

使用.NET 3.5和C#3.0, IList list = new List(); list.Add(null); 抛出一个ArgumentException,只是感觉不对。 List list = new List(); list.Add(null); 完美的工作。 这是微软代码中的错误吗? 在现实生活中如何产生这种错误的一个例子: new JavaScriptSerializer().Deserialize<List>(“[true, false, null]”);

MSTEST – 异步Testinitialize保证测试失败

只是想知道,如果有人这样想: 这是在TestInitialize中进行异步调用的错误设计,因为TestInitialize必须在任何TestMethod之前发生。 这可能是以任何方式进行异步TestInitialize的正确方法吗? private int val = 0; [TestInitialize] public async Task TestMehod1() { var result = await LongRunningMethod(); val = 10; } [TestMethod] public void TestMehod2() { Assert.AreEqual(10, val); } 任何想法?

VBA相当于使用C#或VB.NET导入/创建别名

基础参考: VBA,Visual Basic .NET和C#的十个代码转换 注意: 我已经创建并导入了一个*.dll ,这个问题是关于 别名的 。 假设Test类的编程名称是TestNameSpace.Test [ProgId(“TestNamespace.Test”)] public class Test … 现在,假设一个C#解决方案已被密封并编译成*.dll ,我在Excel的VBE中引用它。 注意:此时我无法修改程序名称,就好像*.dll不是我编写的那样。 这是在VBA :而不是像这样声明一个变量: Dim myTest As TestNameSpace.Test Set myTest = new TestNameSpace.Test 我更喜欢称之为(仍在VBE中) Dim myTest As Test Set myText = new Test 在C#中你通常会说 using newNameForTest = TestNamespace.Test; newNameForTest myTest = new NewNameForTest; 注意:假设VBA项目中没有命名空间冲突 问题: 在VBA中using或VB.NET imports别名是否有相同的调用?

如何从服务接收OutputDebugString?

我正在尝试使用以下代码捕获所有OutputDebugString消息(包括来自服务的消息)。 它运行正常,直到我迁移到Windows 7。 问题是,由于Windows Vista服务在低级别的Session#0中运行,有些人说它不可能捕获它们而一些它是不可能的 。 你怎么看? 是否可以通过增加一些权限来修改以下代码,以便能够从Session#0接收OutputDebugString消息? 换一种说法; 是否可以在会话#0中与会话#0共享DBWIN_BUFFER? 我想它应该是可能的,因为例如DebugView可以做到这一点,并且我看不到任何服务助手会将这些消息(例如通过命名管道)从Session#0发送到GUI正在运行的Session#1。 问题将是安全设置中的IMO。 任何人都可以建议我如何修改它们? type TODSThread = class(TThread) protected procedure Execute; override; end; … procedure TODSThread.Execute; var SharedMem: Pointer; SharedFile: THandle; WaitingResult: DWORD; SharedMessage: string; DataReadyEvent: THandle; BufferReadyEvent: THandle; SecurityAttributes: SECURITY_ATTRIBUTES; SecurityDescriptor: SECURITY_DESCRIPTOR; begin SecurityAttributes.nLength := SizeOf(SECURITY_ATTRIBUTES); SecurityAttributes.bInheritHandle := True; SecurityAttributes.lpSecurityDescriptor := @SecurityDescriptor; if not InitializeSecurityDescriptor(@SecurityDescriptor, […]

以64位运行测试

我有一个编译为64位的ADO.NET驱动程序。 因此,我需要在64位模式下运行mstests。 那可能吗? (开发机器是64位)。

使用C#中的复杂用户定义类型(UDT)调用VB6 DLL函数

我正在编写一个C#应用程序来调用第三方VB6 DLL。 我在References-> COM选项卡中添加了对VB6 DLL的引用。 DLL中的特定方法采用VB6 UDT(用户定义类型)作为参数。 此UDT在COM的自动生成的.NET包装器中显示为结构。 该结构具有许多子UDT /结构以及VBA.Collection类型的成员(如.NET元数据所示)。 它还有常规数据类型,如string,short,double,int等。 我在我的C#代码中初始化这个结构为: udtEmployee udtEmpData = default(udtEmployee); 我也试过了 udtEmpData = new udtEmployee(); 如果我没有使用default或new初始化它,我无法编译我的C#代码,因为编译器抱怨使用未分配的变量。 我需要传递这个结构作为参考。 我是这样做的: clsEmployee.SetData(ref udtEmpData); 在调用VB6 DLL的这个方法时,我收到错误: 错误:尝试读取或写入受保护的内存。 这通常表明其他内存已损坏。 原因是什么,解决方案是什么? 注意,我无法更改VB6 DLL,因为我没有其源代码。 我正在使用VS 2005。 编辑1: 这是一个完整的背景: 有一个本地开发的ERP产品,它支持使用VB6进行附加开发。 它有一个配置文件,它指定要加载的附加DLL的名称。 然后,这些插件将显示在ERP应用程序的菜单中。 在菜单上单击,ERP调用名为StartAddOn()的函数,该函数应存在于VB6 DLL中。 我想在C#中开发附加组件,因此我开发了一个带有StartAddOn方法的简单VB6插件,该方法又将控制权传递给我的.NET DLL。 .NET DLL使用ERP公开的业务类,并来回传递数据对象。 在.NET DLL中,我添加了对ERP供应商发布的DLL的COM引用。 所以架构是这样的:ERP-> VB6 AddOn和StartAddOn方法 – > .NET DLL->使用ERP供应商发布的COM […]