小编Adi*_*ter的帖子

定义构造函数签名的接口?

这是我第一次碰到这个问题,这很奇怪,但是:

如何在C#接口中定义构造函数?

编辑
有些人想要一个例子(这是一个空闲时间项目,所以是的,这是一个游戏)

IDrawable
+ Update
+ Draw

为了能够更新(检查屏幕边缘等)并绘制自己,它总是需要一个GraphicsDeviceManager.所以我想确保对象有引用它.这将属于构造函数.

现在,我写下来我想我在这里实施的IObservableGraphicsDeviceManager应该采取的IDrawable......看来要么我不明白的XNA框架或框架不是想出来的非常好.

编辑
在接口的上下文中,我对构造函数的定义似乎有些混乱.实际上不能实例化接口,因此不需要构造函数.我想要定义的是构造函数的签名.正如接口可以定义某个方法的签名,接口可以定义构造函数的签名.

c# constructor interface

526
推荐指数
9
解决办法
29万
查看次数

公共字段与自动属性

我们经常被告知我们应该通过为类字段制作getter和setter方法(C#中的属性)来保护封装,而不是将字段暴露给外部世界.

但是很多时候,一个字段只是用来保存一个值,并且不需要任何计算来获取或设置.对于这些,我们都会这样做:

public class Book
{
    private string _title;

    public string Title
    {
          get{ return _title;  }
          set{ _title = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

好吧,我有一个坦白,我不忍心写所有这些(真的,它不必写它,它不得不看它),所以我去流氓和使用公共领域.

然后是C#3.0,我看到他们添加了自动属性:

public class Book
{
    public string Title {get; set;} 
}
Run Code Online (Sandbox Code Playgroud)

这更整洁,我很感激它,但是真的,除了创建一个公共领域之外还有什么不同?

public class Book
{
    public string Title;
}
Run Code Online (Sandbox Code Playgroud)

c# field properties class automatic-properties

333
推荐指数
10
解决办法
6万
查看次数

为什么标志枚举通常用十六进制值定义

很多时候,我看到使用十六进制值的标志枚举声明.例如:

[Flags]
public enum MyEnum
{
    None  = 0x0,
    Flag1 = 0x1,
    Flag2 = 0x2,
    Flag3 = 0x4,
    Flag4 = 0x8,
    Flag5 = 0x10
}
Run Code Online (Sandbox Code Playgroud)

当我声明一个枚举时,我通常会这样声明:

[Flags]
public enum MyEnum
{
    None  = 0,
    Flag1 = 1,
    Flag2 = 2,
    Flag3 = 4,
    Flag4 = 8,
    Flag5 = 16
}
Run Code Online (Sandbox Code Playgroud)

是否有理由或理由为什么有些人选择用十六进制而不是十进制来写值?我看到它的方式,使用十六进制值并意外写Flag5 = 0x16而不是更容易混淆Flag5 = 0x10.

.net c# enums enum-flags

117
推荐指数
6
解决办法
3万
查看次数

在try/catch/finally中等待的好方法?

我需要asynccatch块中调用一个方法,然后再次抛出异常(带有它的堆栈跟踪),如下所示:

try
{
    // Do something
}
catch
{
    // <- Clean things here with async methods
    throw;
}
Run Code Online (Sandbox Code Playgroud)

但不幸的是你无法await在一个catch或一个finally块中使用.我学会了它是因为编译器没有任何方法可以回到catch块中来执行你的await指令之类的东西......

我试图用来Task.Wait()替换await,我遇到了僵局.我在网上搜索了如何避免这种情况并找到了这个网站.

由于我无法更改async方法,也不知道它们是否使用ConfigureAwait(false),因此我创建了这些方法,这些方法Func<Task>在我们处于不同的线程(以避免死锁)并等待其完成时启动异步方法:

public static void AwaitTaskSync(Func<Task> action)
{
    Task.Run(async () => await action().ConfigureAwait(false)).Wait();
}

public static TResult AwaitTaskSync<TResult>(Func<Task<TResult>> action)
{
    return Task.Run(async () => await action().ConfigureAwait(false)).Result;
}

public static void AwaitSync(Func<IAsyncAction> action)
{
    AwaitTaskSync(() …
Run Code Online (Sandbox Code Playgroud)

.net c# exception-handling async-await c#-5.0

89
推荐指数
3
解决办法
4万
查看次数

如何将UI Dispatcher传递给ViewModel

我应该能够访问属于View 的Dispatcher,我需要将它传递给ViewModel.但是View应该对ViewModel一无所知,那么你如何传递它呢?引入一个接口或者不是将它传递给实例创建一个将由View编写的全局调度程序单例?您如何在MVVM应用程序和框架中解决这个问题?

编辑:请注意,因为我的ViewModel可能是在后台线程中创建的,所以我不能只Dispatcher.Current在ViewModel的构造函数中创建.

.net wpf dispatcher mvvm

69
推荐指数
6
解决办法
5万
查看次数

使用MemoryCache的多个实例

我想使用System.Runtime.Caching命名空间向我的应用程序添加缓存功能,并且可能希望在几个地方和不同的上下文中使用缓存.为此,我想使用几个MemoryCache实例.

但是,我在这里看到不鼓励使用多个MemoryCache实例:

MemoryCache不是单例,但是您应该只创建一些或者可能只创建一个MemoryCache实例,缓存项目的代码应该使用这些实例.

多个MemoryCache实例将如何影响我的应用程序?我发现这种奇怪,因为在我看来,在应用程序中使用多个缓存是一种非常常见的情况.

编辑:更具体地说,我有一个类应该为每个实例保留一个缓存.我应该避免使用MemoryCache并寻找不同的缓存解决方案吗?MemoryCache在这种情况下使用是否被认为是坏的,如果是这样,为什么?

.net c# caching .net-4.0 memorycache

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

删除所有DataGrid行和单元格边框

我想隐藏(或删除)我的数据网格中所有行(以及随后的单元格)的所有边框,想一个基本的HTML表.我看了一遍,大多数问题似乎是关于造型而不是隐藏它们.

我已经尝试过像这样设置BorderBrush和BorderThickness:

 <DataGrid.RowStyle>
     <Style TargetType="DataGridRow">
         <Setter Property="BorderBrush" Value="Transparent" />
         <Setter Property="BorderThickness" Value="0" />
     </Style>
  </DataGrid.RowStyle>
Run Code Online (Sandbox Code Playgroud)

为CellStyle尝试了相同,但没有骰子,仍然看到边界.

.net c# wpf xaml datagrid

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

为什么我们需要Thread.MemoryBarrier()?

在"C#4 in a Nutshell"中,作者表明这个类有时可以写0 MemoryBarrier但是我无法在我的Core2Duo中重现:

public class Foo
{
    int _answer;
    bool _complete;
    public void A()
    {
        _answer = 123;
        //Thread.MemoryBarrier();    // Barrier 1
        _complete = true;
        //Thread.MemoryBarrier();    // Barrier 2
    }
    public void B()
    {
        //Thread.MemoryBarrier();    // Barrier 3
        if (_complete)
        {
            //Thread.MemoryBarrier();       // Barrier 4
            Console.WriteLine(_answer);
        }
    }
}

private static void ThreadInverteOrdemComandos()
{
    Foo obj = new Foo();

    Task.Factory.StartNew(obj.A);
    Task.Factory.StartNew(obj.B);

    Thread.Sleep(10);
}
Run Code Online (Sandbox Code Playgroud)

这种需要对我来说似乎很疯狂.如何识别出现这种情况的所有可能情况?我认为如果处理器改变了操作顺序,它需要保证行为不会改变.

你还懒得使用障碍吗?

.net c# multithreading thread-safety memory-barriers

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

不确定何时使用抽象属性,何时不使用

我不确定什么看起来更好,或者我什么时候在抽象类和属性中使用,或何时使用非抽象属性.我将尝试做一个简单的例子.假设我有这个:

abstract class Human
{
  public GenderType Gender { get; set; }
  public string Name { get; set; }
  public Date Born { get; set; }
  public bool IsNerd { get; set; }

  abstract public void Speak();
  abstract public void Sleep();
  abstract public void AnoyingPeopleOnStackOverflow();
  //... so on
}

class Peter : Human
{
  //Peter is special, he got a second name
  //But thats all, everything else is the same as like on other humans
  public string SecondName { get; …
Run Code Online (Sandbox Code Playgroud)

.net c# oop properties abstract

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

如何从App.Config文件设置CultureInfo.CurrentCulture?

我需要通过App.Config文件设置应用程序的文化,以便"pt-BR"自动用于解析日期,而无需为每个操作手动通知文化.

据我所知,有一个globalization部分可以system.web在Web.Config文件的部分内定义,但我正在运行一个控制台应用程序,我无法解决这个问题.

任何的想法?

.net globalization configuration localization app-config

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