有没有办法在自动实现的属性中设置setter/getter的断点?
int Counter { get; set; }
Run Code Online (Sandbox Code Playgroud)
除了将其更改为标准属性(我这样做,但要做到这一点,我必须更改并重新编译整个项目)
我想添加一些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#中实现这一目标的最佳方法是什么?
与此答案相关,
如果我真的想要"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)
因此编程错误会引发异常并升级(通常会导致进程失效).
在具有预期(和可忽略的)异常的方法的情况下,该方法需要变得更加精细(除此之外,关于如何构建此方法的版本的任何建议将采用可接受和可忽略的异常类型的列表? )
我一直在试图追查了以下问题的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) 在构建时,我希望能够将消息打印到构建输出窗口而不将其归类为警告.即在Visual Studio错误列表中,我希望仅在您打开"消息"过滤器时才显示它.
所以,我想要相同的功能,
#warning Warning Message
但我不希望它被归类为警告.
语境:
我有很多项目目前会产生很多警告.我首先要做的是防止引入新的警告.所以,我:
#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)
我对处理这个问题的其他方法持开放态度.
当IProgress<T>
用于报告进度时,它应该是
IProgress<T>
要意识到进展报告的频率可能高于其提出这一进展的方式.问题的背景是我有一些IProgress<T>
用于报告进度的代码,它以非常高的速度报告进展情况.我想用UI进度条显示进度.如果我使用提供的Progress<T>
实现(将进度发布到UI SyncronizationContext),那么它会导致UI无响应(即,有很多消息发送到消息队列,用户甚至无法单击"取消"按钮在对话框上).
所以,
IProgress<T>
实现只是将进度写入日志文件(并且可以处理高报告频率),那该怎么办呢?-要么-IProgress<T>
实现来解决这个问题,该实现限制了我处理/报告进度的频率.据推测,此实现将记录非UI线程的最新进度,然后(可能)UI将基于计时器进行更新.在观察窗口中,我正在尝试查看TaskScheduler.Current
,但它显示以下错误:
The type 'System.Threading.Tasks.TaskScheduler' exists in both
'CommonLanguageRuntimeLibrary' and 'System.Threading.dll'
Run Code Online (Sandbox Code Playgroud)
从那以后,我的计划就是这样:
TaskScheduler
mscorlib(CommonLanguageRuntimeLibrary)的.NET 4.0 exeTaskScheduler
相同的命名空间.问题:我可以在调试器中使用什么语法来指定TaskScheduler
我想要检查的dll ?
顺便说一句:我假设没有问题(即没有未定义的行为)将这两个相同命名的类型带入同一个可执行文件中,对吧?
给定一个加载Assembly
是否有一种方法(在代码中)来确定它被加载到的3个加载上下文中的哪一个(默认的Load,LoadFrom或Neither)?
在Suzanne Cook的"选择绑定上下文"一文中,将程序集加载到LoadFrom时会出现一些缺点.特别是,我的库使用反序列化并遇到InvalidCastException
加载到LoadFrom上下文时.
目前我的库失败很晚(它在执行有问题的反序列化代码时失败 - 请参阅我的示例).在这些情况下,我想通过检测加载的上下文并在未加载到默认Load上下文时抛出异常来使其失败.
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:
如果没有为引用类型做任何特殊操作,则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可以定义为不同的东西:
Ids
相等(代表同一个人但具有不同地址的两个对象将返回true)问题:这个课程中哪些(如果有的话)更适合?(或许问题应该是,"这个班级的大多数客户如何期望Equals()表现?")
笔记:
Hashset
or中使用这个类更加困难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)c# ×10
.net ×2
async-await ×2
breakpoints ×1
c#-3.0 ×1
c#-4.0 ×1
debugging ×1
preprocessor ×1
progress ×1
properties ×1
windows ×1
winforms ×1