小编Gre*_*g D的帖子

为什么使用EventArgs.Empty而不是null?

我记得在多次和多个地点阅读时,在解雇典型事件时:

protected virtual OnSomethingHappened()
{
    this.SomethingHappened(this, EventArgs.Empty);
}
Run Code Online (Sandbox Code Playgroud)

如果没有有趣的事件参数,则应该是EventArgs.Empty,而不是null.

我遵循了我的代码中的指导,但我意识到我不清楚为什么这是首选技术.为什么声明的合约更喜欢EventArgs.Empty而不是null?

c# events eventargs

67
推荐指数
3
解决办法
1万
查看次数

Josh Smith对RelayCommand的实施有缺陷吗?

考虑参考Josh Smith的文章WPF Apps with Model-View-ViewModel Design Pattern,特别是a的示例实现RelayCommand(图3).(无需阅读整篇文章以了解此问题.)

在一般情况下,我想实现是优秀的,但我有一个代表团的问题CanExecuteChanged订阅到CommandManagerRequerySuggested事件.各州的文件RequerySuggested:

由于此事件是静态的,因此它只会作为弱引用保留在处理程序中.侦听此事件的对象应该对其事件处理程序保持强引用,以避免它被垃圾回收.这可以通过拥有私有字段并在附加到此事件之前或之后将处理程序指定为值来实现.

然而,示例实现RelayCommand不会对订阅的处理程序维护任何此类:

public event EventHandler CanExecuteChanged
{
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
}
Run Code Online (Sandbox Code Playgroud)
  1. 这是否泄漏了弱RelayCommand客户端的漏洞,要求用户RelayCommand了解自己的实施CanExecuteChanged并维护一个实时参考?
  2. 如果是这样,例如,修改实现RelayCommand类似于以下内容以减轻CanExecuteChanged订户的潜在过早GC 是否有意义:

    // This event never actually fires.  It's purely lifetime mgm't.
    private event EventHandler canExecChangedRef;
    public event EventHandler CanExecuteChanged
    {
        add 
        { 
            CommandManager.RequerySuggested += value; …
    Run Code Online (Sandbox Code Playgroud)

wpf weak-references mvvm relaycommand icommand

41
推荐指数
4
解决办法
1万
查看次数

是否适合扩展Control以提供始终如一的安全Invoke/BeginInvoke功能?

在我维护一个严重违反winforms中的跨线程更新规则的旧应用程序的过程中,我创建了以下扩展方法,以便在我发现它们时快速修复非法调用:

/// <summary>
/// Execute a method on the control's owning thread.
/// </summary>
/// <param name="uiElement">The control that is being updated.</param>
/// <param name="updater">The method that updates uiElement.</param>
/// <param name="forceSynchronous">True to force synchronous execution of 
/// updater.  False to allow asynchronous execution if the call is marshalled
/// from a non-GUI thread.  If the method is called on the GUI thread,
/// execution is always synchronous.</param>
public static void SafeInvoke(this Control uiElement, Action updater, bool forceSynchronous)
{
    if …
Run Code Online (Sandbox Code Playgroud)

c# extension-methods controls invoke winforms

33
推荐指数
2
解决办法
8592
查看次数

哪个代码更具可读性?

假设我有两种方法bool Foo()bool Bar().以下哪项更具可读性?

if(Foo())
{
    SomeProperty = Bar();
}
else
{
    SomeProperty = false;
}
Run Code Online (Sandbox Code Playgroud)

要么

SomeProperty = Foo() && Bar();
Run Code Online (Sandbox Code Playgroud)

一方面,我认为短路&&是一个有用的功能,第二个代码样本要短得多.另一方面,我不确定人们通常习惯于&&在条件陈述之外看到,所以我想知道是否会引入一些认知失调,这使得第一个样本成为更好的选择.

你怎么看?还有其他影响决策的因素吗?比如,如果&&表达式长于可以放在屏幕上的一行,我应该更喜欢前者吗?


答案后澄清:

我应该把一些事情包括在答案提出的最初问题中.

  • Bar()可能比执行起来更昂贵Foo(),但这两种方法都不应该有副作用.
  • 这些方法都被更恰当地命名,而不是像这个例子中那样. Foo()归结为类似CurrentUserAllowedToDoX()Bar()更像是,XCanBeDone()

c# readability

32
推荐指数
7
解决办法
3687
查看次数

我可以获得结构字段的大小而不创建结构的实例吗?

如果你有一个struct的实例,那么在C++中获取struct字段的大小是微不足道的.例如(未编译):

typedef struct Foo {
    int bar;
    bool baz;
} Foo;

// ...

Foo s;
StoreInSomething(s.bar, sizeof(s.bar)); // easy as pie
Run Code Online (Sandbox Code Playgroud)

现在我仍然可以做这样的事情,但是我正在实现的接口(我得到一个BOOL,指示一个位域中特定位的状态应该是什么),我只是创建结构来获得大小数据成员.有没有办法向编译器指示它应该使用struct字段的大小而不创建struct的实例?这将是哲学上的等价物:

SetBit(bool val) {
    StoreInSomething(
        BITFIELD_POSITION_CONSTANT, // position of bit being set
        val,                        // true = 1, false = 0
        sizeof(Foo::bar));          // This is, of course, illegal.  (The method I've been told I must use req's the size of the target field.)
}
Run Code Online (Sandbox Code Playgroud)

在堆栈上创建结构应该快速且便宜,但我怀疑在代码审查中我会得到它,所以我正在寻找一种更好的方法,不会引入额外的维护负担(例如#defines for sizes).

c++ sizeof

29
推荐指数
3
解决办法
1万
查看次数

如何检测我是否在控制台中运行

是否有一种简单的方法可以让代码库自动检测是否从控制台应用程序或Windows应用程序调用它?我希望我的库不报告Windows事件日志,如果它是从控制台窗口调用,而是报告给控制台窗口.但是,如果它不在控制台窗口中运行,则应报告给Windows事件日志.

我考虑过要求我的日志记录组件传递日志目标,但如果它本身可以自动处理这两个目标,它会很整洁.我还没有需要像log4net这样广泛的东西,事实上,如果有必要提供支持来记录数据库/文件和其他未知的日志记录目标,那么我可能会推荐这样的解决方案.现在,只是让我的组件自动检测环境并根据环境登录到控制台或事件日志就足够了.

.net c# vb.net logging

16
推荐指数
2
解决办法
7867
查看次数

为什么C#(相当慢)和Win32/C之间的性能差异?

我们希望将性能关键型应用程序迁移到.Net,并发现c#版本比Win32/C慢30%到100%,具体取决于处理器(移动T7200处理器上的差异更明显).我有一个非常简单的代码示例来演示这一点.为简洁起见,我将只显示C版本 - c#是直接翻译:

#include "stdafx.h"
#include "Windows.h"

int array1[100000];
int array2[100000];

int Test();

int main(int argc, char* argv[])
{
    int res = Test();

    return 0;
}

int Test()
{
    int calc,i,k;
    calc = 0;

    for (i = 0; i < 50000; i++) array1[i] = i + 2;

    for (i = 0; i < 50000; i++) array2[i] = 2 * i - 2;

    for (i = 0; i < 50000; i++)
    {
        for (k = 0; k < 50000; k++)
        { …
Run Code Online (Sandbox Code Playgroud)

.net c c# performance winapi

16
推荐指数
3
解决办法
1884
查看次数

为什么DateTime是.Net中的结构?

为什么是DateTime结构而不是可继承的类?

(我希望能够覆盖ToString()方法,但我不能.)

.net datetime structure

15
推荐指数
6
解决办法
4147
查看次数

为什么这个虚拟析构函数会触发一个未解析的外部?

考虑以下:

Xh:

class X
{
    X();
    virtual ~X();
};
Run Code Online (Sandbox Code Playgroud)

X.cpp:

#include "X.h"

X::X()
{}
Run Code Online (Sandbox Code Playgroud)

尝试构建这个(我使用的是.dll目标,以避免在丢失的main上出现错误,我正在使用Visual Studio 2010):

错误1错误LNK2001:未解析的外部符号"private:virtual __thiscall X :: ~X(void)"(?? 1X @@ EAE @ XZ)

然而,小的修改导致成功构建:

XH:

class X
{
    inline X(); // Now inlined, and everything builds
    virtual ~X();
};
Run Code Online (Sandbox Code Playgroud)

要么

XH:

class X
{
    X();
    ~X(); // No longer virtual, and everything builds
};
Run Code Online (Sandbox Code Playgroud)

当.dtor是虚拟的或者.ctor没有内联时,是什么导致链接器中未解析的外部?

编辑:

或者,或许更有趣的是,如果我将析构函数设置为非虚拟,或者如果我内联构造函数,为什么我没有得到未解析的外部?

c++ destructor virtual-functions unresolved-external

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

获取角色 - Azure API返回(400)错误请求

我有很多Azure管理API使用下面的代码,除了GetRole for Virtual Machines.这是api调用的文档:https://msdn.microsoft.com/en-us/library/azure/jj157193.aspx

这是我试图执行的代码:

static void Main(string[] args)
        {
            Program p = new Program();
            p.MakeRequest();
        }

        public void MakeRequest()
        {
            string strThumbprint = "{thumbprint}";
            X509Certificate2 certificate = GetStoreCertificate(strThumbprint);
            string strRequestURI = "https://management.core.windows.net/{subscription}/services/hostedservices/{cloud-service}/deployments/{deployment}/roles/{rolename}";
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(strRequestURI);
            request.ClientCertificates.Add(certificate);
            request.ContentType = "application/xml";
            request.Headers.Add("x-ms-version", "2015-04-01");
            try
            { 
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Console.WriteLine("Status Code: " + response.StatusCode.ToString());
            Stream receiveStream = response.GetResponseStream();
            Encoding encode = Encoding.GetEncoding("utf-8");
            StreamReader readStream = new StreamReader(receiveStream, encode);
            Console.WriteLine(readStream.ReadToEnd());
            response.Close();
            }
            catch(Exception ex)
            {
                Console.WriteLine("Error: " + …
Run Code Online (Sandbox Code Playgroud)

c# azure azure-management-api

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