Tag: C#的

C#前后增量混淆

我对C#编译器如何处理前后增量和递减有点困惑。 当我编码如下: int x = 4; x = x++ + ++x; x之后会有10的值。 我认为这是因为预增量将x设置为5 ,这使得5+5评估为10 。 然后后增加将更新x为6 ,但是这个值将不会被使用,因为那么10将被分配给x 。 但是当我编码: int x = 4; x = x– – –x; 那么x会在2之后。 任何人都可以解释为什么是这样的情况?

在使用语句中引发exception时Dispose是否仍然被调用?

在下面的例子中,如果在using语句中抛出exception,连接是否会closures并处理? using (var conn = new SqlConnection("…")) { conn.Open(); // stuff happens here and exception is thrown… } 我知道下面的代码将确保它,但我很好奇如何使用语句。 var conn; try { conn = new SqlConnection("…"); conn.Open(); // stuff happens here and exception is thrown… } // catch it or let it bubble up finally { conn.Dispose(); } 有关: 抛出exception时,确保SQL连接的正确方法是什么?

是否有一个IDictionary的实现,在丢失的键,返回默认值,而不是抛出?

如果关键字丢失,Dictionary中的索引器将引发exception。 是否有一个IDictionary的实现,而不是将返回默认(T)? 我知道“TryGetValue”方法,但这是不可能与linq一起使用的。 这会有效地做我需要的东西吗? myDict.FirstOrDefault(a => a.Key == someKeyKalue); 我不认为这将会迭代键而不是使用散列查找。

AC#相当于C的fread文件I / O

任何人都可以告诉我如何在C#.NET版本2中直接获取一个字节数组结构? 就像C语言中熟悉的fread一样,到目前为止,我在读取字节stream和自动填充结构方面还没有取得太大的成功。 我已经看到一些使用unsafe关键字在托pipe代码中存在指针hocus-pocus的实现。 看看这个例子: public unsafe struct foobarStruct{ /* fields here… */ public foobarStruct(int nFakeArgs){ /* Initialize the fields… */ } public foobarStruct(byte[] data) : this(0) { unsafe { GCHandle hByteData = GCHandle.Alloc(data, GCHandleType.Pinned); IntPtr pByteData = hByteData.AddrOfPinnedObject(); this = (foobarStruct)Marshal.PtrToStructure(pByteData, this.GetType()); hByteData.Free(); } } } 我有两个构造函数foobarStruct的原因 是不是有一个空的构造函数。 在实例化结构时将一块内存(作为字节数组)传入构造函数。 这个实现是否足够好,还是有一个更干净的方法来实现这一点? 编辑:我不想使用ISerializable接口或其实现。 我正在尝试读取一个二进制图像来解决使用的字段,并使用PE结构确定其数据。

运行多个UI线程

跳到问题的底部; 这只是一些额外的信息 我正在使用一个组件(GeckoFX)来渲染一些网站,很好,但它只能在Windows窗体中使用; 因为它必须绑定到可以绘制的WinForms对象。 由于所有的WinForms都在同一个线程中运行,我一次只能使用一个GeckoFX实例; 所以我决定创build一个WinFormforms的“工人类”,并在其中添加所有的逻辑。 表单不需要与主表单进行通信。 现在我可以启动10个窗口,最终它们将工作,但是在所有其他窗体处理完所有GeckoFX事件之前,每个新窗体都将等待,因为您不能在一个线程上使用多个实例。 此外,浏览器必须在UIThread上。 所以: 是否有可能创build多个UI线程(每个表单一个)? 我看到有人这样做( http://74.125.77.132/search?q=cache:PrFTaH2nx_YJ:geckofx.org/viewtopic.php%3Fid%3D453+geckofx+service&cd=1&hl=nl&ct=clnk&gl=nl&client=firefox-a ),但从来没有人得到他的代码示例工作。 做这个工作的人最初使用某种forms的定制信息来做这种事情,但我不知道如何做到这一点。

Foreachmacrosmacros参数

我想知道是否有可能编写一个macros的foreachmacros参数。 这是什么想要做的: #define PRINT(a) printf(#a": %d", a) #define PRINT_ALL(…) ? ? ? THE PROBLEM ? ? ? 和可能的用法: int a = 1, b = 3, d = 0; PRINT_ALL(a,b,d); 这是我迄今取得的成就 #define FIRST_ARG(arg,…) arg #define AFTER_FIRST_ARG(arg,…) , ##__VA_ARGS__ #define PRINT(a) printf(#a": %d", a) #define PRINT_ALL PRINT(FIRST_ARG(__VA_ARGS__)); PRINT_ALL(AFTER_FIRST_ARG(__VA_ARGS__)) 这是一个recursionmacros,这是非法的。 另一个问题是recursion的stop condition 。

c ++ Vector,每当它在堆栈上展开/重新分配时会发生什么?

我是新来的C + +,我在我的项目上使用vector类。 我发现它非常有用,因为我可以有一个数组,在必要时自动重新分配(例如,如果我想push_back一个项目,并且vector已经达到了最大容量,它会重新分配自己,向操作系统请求更多的内存空间)访问vector的元素非常快(它不像列表,为了达到“第n个”元素,我必须通过“n”个第一个元素)。 我发现这个问题非常有用,因为他们的答案完美地解释了“内存分配器”是如何工作的,当我想把我的vector存储在堆/栈上时: [1] vector<Type> vect; [2] vector<Type> *vect = new vector<Type>; [3] vector<Type*> vect; 然而,有一个疑问是困扰我一段时间,我无法find答案:每当我构build一个向量,并开始推入大量的项目,它会达到vector将满的一刻,所以继续增长它将需要重新分配,复制自己到一个新的位置,然后继续push_back项目(显然,这个重新分配它隐藏在类的实现,所以它是完全透明的我) 好的,如果我已经在堆上创build了这个向量[2],我不会想象会发生什么事情:类向量调用malloc,获取新的空间,然后将自身复制到新的内存中,最后删除自由调用的旧内存。 然而,当我在栈上构造一个向量时,面纱隐藏了发生的事情:当向量必须重新分配时,会发生什么? AFAIK,无论何时在C / C ++中input一个新的函数,计算机都会查看variables的声明,然后展开堆栈以获得必要的空间来放置这些variables,但是在堆栈中不能分配更多的空间function已经在运行。 类vector如何解决这个问题?

有没有.NET方法来枚举所有可用的networking打印机?

有一个简单的方法来枚举所有可见的networking打印机在.NET中? 目前,我正在显示PrintDialog以允许用户select打印机。 问题是,本地打印机也显示(以及XPS文档编写器等)。 如果我能枚举自己的networking打印机,我可以显示一个自定义对话框只有这些打印机。 谢谢!!

System.Windows.Forms.TextBox中的水印

他在.Net 2.0中使用C#实现System.Windows.Forms.TextBox Watermarkfunction的最佳方式是什么? 编辑: 使用CodeProject现成的组件非常容易。 这也是一个代码项目开放许可证(CPOL)。

如何在远程机器上执行进程,在C#

我怎样才能在远程计算机上启动一个进程,说计算机名=“someComputer”,使用System.Diagnostics.Process类? 我在远程计算机上创build了一个小型控制台应用程序,它只是将“Hello world”写入一个txt文件,我想远程调用它。 控制台应用程序path:c:\ MyAppFolder \ MyApp.exe 目前我有这个: ProcessStartInfo startInfo = new ProcessStartInfo(string.Format(@"\\{0}\{1}", someComputer, somePath); startInfo.UserName = "MyUserName"; SecureString sec = new SecureString(); string pwd = "MyPassword"; foreach (char item in pwd) { sec.AppendChar(item); } sec.MakeReadOnly(); startInfo.Password = sec; startInfo.UseShellExecute = false; Process.Start(startInfo); 我不断收到“networkingpath未find”。