小编Mat*_*ith的帖子

调试自动属性

有没有办法在自动实现的属性中设置setter/getter的断点?

int Counter { get; set; }
Run Code Online (Sandbox Code Playgroud)

除了将其更改为标准属性(我这样做,但要做到这一点,我必须更改并重新编译整个项目)

c# properties breakpoints visual-studio

122
推荐指数
4
解决办法
2万
查看次数

"仅调试"代码,只有在"打开"时才能运行

我想添加一些C#"仅调试"代码,只有在调试人员请求它时才会运行.在C++中,我曾经做过类似以下的事情:

void foo()
{   
  // ...
  #ifdef DEBUG
  static bool s_bDoDebugOnlyCode = false;
  if (s_bDoDebugOnlyCode)
  {
      // Debug only code here gets executed when the person debugging 
      // manually sets the bool above to true.  It then stays for the rest
      // of the session until they set it to false.
  }
  #endif
 // ...
}
Run Code Online (Sandbox Code Playgroud)

我不能在C#中完全相同,因为没有本地静态.

问题:在C#中实现这一目标的最佳方法是什么?

  1. 我应该使用带有C#预处理器指令的私有类静态字段(#if /#endif DEBUG)吗?
  2. 我应该使用Conditional属性(保存代码),然后使用私有类静态字段(不包含 C#预处理器指令#if /#endif DEBUG?).
  3. 别的什么?

c# debugging preprocessor

85
推荐指数
5
解决办法
9万
查看次数

火和忘记方法

此答案相关,

如果我真的想要"Fire and Forget"一个确实返回任务的方法,并且(为简单起见)让我们假设该方法不会抛出任何异常.我可以使用答案中列出的扩展方法:

public static void Forget(this Task task)
{
}
Run Code Online (Sandbox Code Playgroud)

使用这种方法,如果存在错误,则会Task引发异常,然后抛出意外异常时,异常将被吞下并被忽视.

问题:在这种情况下,扩展方法的形式是否更合适:

public static async void Forget(this Task task)
{
    await task;
}
Run Code Online (Sandbox Code Playgroud)

因此编程错误会引发异常并升级(通常会导致进程失效).

在具有预期(和可忽略的)异常的方法的情况下,该方法需要变得更加精细(除此之外,关于如何构建此方法的版本的任何建议将采用可接受和可忽略的异常类型的列表? )

c# async-await

38
推荐指数
1
解决办法
2万
查看次数

在主UI线程的Continuation中,SynchronizationContext.Current为null

我一直在试图追查了以下问题的WinForms应用程序:
SynchronizationContext.Current是一个任务的延续(即空.ContinueWith这是主要的线程上运行)(我预计当前同步上下文是System.Windows.Forms.WindowsFormsSynchronizationContext).

以下是演示此问题的Winforms代码:

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            TaskScheduler ts = TaskScheduler.FromCurrentSynchronizationContext(); // Get the UI task scheduler

            // This line is required to see the issue (Removing this causes the problem to go away), since it changes the codeflow in 
            // \SymbolCache\src\source\.NET\4\DEVDIV_TFS\Dev10\Releases\RTMRel\ndp\clr\src\BCL\System\Threading\ExecutionContext.cs\1305376\ExecutionContext.cs
            // at line 435
            System.Diagnostics.Trace.CorrelationManager.StartLogicalOperation("LogicalOperation");

            var task = Task.Factory.StartNew(() => { });
            var cont …
Run Code Online (Sandbox Code Playgroud)

c# winforms synchronizationcontext task-parallel-library

21
推荐指数
1
解决办法
5809
查看次数

在构建输出中打印消息(这不是警告)

在构建时,我希望能够将消息打印到构建输出窗口而不将其归类为警告.即在Visual Studio错误列表中,我希望仅在您打开"消息"过滤器时才显示它.

所以,我想要相同的功能, #warning Warning Message 但我不希望它被归类为警告.

语境:

我有很多项目目前会产生很多警告.我首先要做的是防止引入新的警告.所以,我:

  1. 打开"警告为错误"
  2. 通过并用于#pragma warning disable/restore消除现有警告.

但是,对于我禁用的警告,我想打印一条消息,指出此处有一个需要调查的警告(因为我还没有调查需要对这些警告做些什么).例如,许多警告都是"过时"类型的警告,我们确实需要在某些时候去做一些工作.所以,我不希望这些警告消失.

理想情况下,我会做这样的事情:

#pragma warning disable 0618
#message Existing Warning: 0618: IObsoleteInterface is obsolete.
class MyClass : IObsoleteInterface
#pragma warning restore 0618
Run Code Online (Sandbox Code Playgroud)

我对处理这个问题的其他方法持开放态度.

c# visual-studio-2010

19
推荐指数
1
解决办法
1997
查看次数

IProgress <T>报告进度的频率

IProgress<T>用于报告进度时,它应该是

  • 代码报告进度的责任是将进度报告限制在"合理"的频率, - 或 -
  • 具体实施的责任是IProgress<T>要意识到进展报告的频率可能高于其提出这一进展的方式.

问题的背景是我有一些IProgress<T>用于报告进度的代码,它以非常高的速度报告进展情况.我想用UI进度条显示进度.如果我使用提供的Progress<T>实现(将进度发布到UI SyncronizationContext),那么它会导致UI无响应(即,有很多消息发送到消息队列,用户甚至无法单击"取消"按钮在对话框上).

所以,

  • 我可以通过报告更少来解决这个问题,但如果我的IProgress<T>实现只是将进度写入日志文件(并且可以处理高报告频率),那该怎么办呢?-要么-
  • 我可以通过创建自己的特定IProgress<T>实现来解决这个问题,该实现限制了我处理/报告进度的频率.据推测,此实现将记录非UI线程的最新进度,然后(可能)UI将基于计时器进行更新.

c# progress async-await

16
推荐指数
1
解决办法
1690
查看次数

当有两个具有相同名称的类型时,如何消除观察窗口中的类型歧义

在观察窗口中,我正在尝试查看TaskScheduler.Current,但它显示以下错误:

The type 'System.Threading.Tasks.TaskScheduler' exists in both 
'CommonLanguageRuntimeLibrary' and 'System.Threading.dll'   
Run Code Online (Sandbox Code Playgroud)

从那以后,我的计划就是这样:

  • 这是一个使用TaskSchedulermscorlib(CommonLanguageRuntimeLibrary)的.NET 4.0 exe
  • dll是通过后期绑定引入的,它引用了旧的Reactive Extensions .NET 3.5 System.Threading.dll,它也具有TaskScheduler相同的命名空间.

问题:我可以在调试器中使用什么语法来指定TaskScheduler我想要检查的dll ?

顺便说一句:我假设没有问题(即没有未定义的行为)将这两个相同命名的类型带入同一个可执行文件中,对吧?

c# visual-studio-2010

15
推荐指数
1
解决办法
1384
查看次数

确定装配的装载上下文

给定一个加载Assembly是否有一种方法(在代码中)来确定它被加载到的3个加载上下文中的哪一个(默认的Load,LoadFromNeither)?

Suzanne Cook的"选择绑定上下文"一文中,将程序集加载到LoadFrom时会出现一些缺点.特别是,我的库使用反序列化并遇到InvalidCastException加载到LoadFrom上下文时.

目前我的库失败很晚(它在执行有问题的反序列化代码时失败 - 请参阅我的示例).在这些情况下,我想通过检测加载的上下文并在未加载到默认Load上下文时抛出异常来使其失败.

c# .net-assembly

15
推荐指数
1
解决办法
2645
查看次数

Restrictions on arguments to PathRelativePathTo in a "long path aware" environment

For a long path aware process on Windows 10, I'm trying to understand what the argument restrictions are when using the windows shell method PathRelativePathTo.

In my example below, I'm using C# via pinvoke to call the method.
I've given multiple examples below and their output. Note:

  • All of the examples give directory paths for "from" and file paths for "to" (none of these paths actually exist on disk)
  • My observations are that
    • Paths under the "short" MAX_PATH length …

.net c# windows c#-3.0 c#-4.0

12
推荐指数
1
解决办法
369
查看次数

是否应该在引用类型上覆盖Equals始终意味着值相等?

如果没有为引用类型做任何特殊操作,则Equals()意味着引用相等(即相同的对象).如果我选择覆盖Equals()引用类型,它是否总是意味着两个对象的值是等价的?

考虑这个可变性 Person类:

class Person
{
    readonly int Id;

    string FirstName { get; set; }
    string LastName { get; set; }
    string Address { get; set; }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

表示完全相同的人的两个对象将始终具有相同的Id,但是其他字段可能随时间不同(即,在地址改变之前/之后).

对于这个对象,Equals可以定义为不同的东西:

  • 价值平等:所有字段都相等(代表同一个人但具有不同地址的两个对象将返回false)
  • 身份平等:Ids相等(代表同一个人但具有不同地址的两个对象将返回true)
  • 参考平等:即不实施等于.

问题:这个课程中哪些(如果有的话)更适合?(或许问题应该是,"这个班级的大多数客户如何期望Equals()表现?")

笔记:

  • 使用Value Equality使得在Hashsetor中使用这个类更加困难Dictionary
  • 使用Identity Equality使得Equals和=运算符之间的关系变得奇怪(即在检查两个Person对象(p1和p2)之后返回true)Equals(),您可能仍然希望更新引用以指向"较新的"Person对象,因为它是不等值).例如,以下代码读取奇怪 - 似乎它什么都不做,但它实际上是删除p1并添加p2:

    HashSet<Person> people = new HashSet<Person>();
    people.Add(p1);
    // ... p2 is an new object that has the same Id as p1 …
    Run Code Online (Sandbox Code Playgroud)

.net c#

11
推荐指数
2
解决办法
1348
查看次数