这是我第一次碰到这个问题,这很奇怪,但是:
如何在C#接口中定义构造函数?
编辑
有些人想要一个例子(这是一个空闲时间项目,所以是的,这是一个游戏)
IDrawable
+ Update
+ Draw
为了能够更新(检查屏幕边缘等)并绘制自己,它总是需要一个GraphicsDeviceManager
.所以我想确保对象有引用它.这将属于构造函数.
现在,我写下来我想我在这里实施的IObservable
和GraphicsDeviceManager
应该采取的IDrawable
......看来要么我不明白的XNA框架或框架不是想出来的非常好.
编辑
在接口的上下文中,我对构造函数的定义似乎有些混乱.实际上不能实例化接口,因此不需要构造函数.我想要定义的是构造函数的签名.正如接口可以定义某个方法的签名,接口可以定义构造函数的签名.
我们经常被告知我们应该通过为类字段制作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) 很多时候,我看到使用十六进制值的标志枚举声明.例如:
[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
.
我需要async
在catch
块中调用一个方法,然后再次抛出异常(带有它的堆栈跟踪),如下所示:
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) 我应该能够访问属于View 的Dispatcher,我需要将它传递给ViewModel.但是View应该对ViewModel一无所知,那么你如何传递它呢?引入一个接口或者不是将它传递给实例创建一个将由View编写的全局调度程序单例?您如何在MVVM应用程序和框架中解决这个问题?
编辑:请注意,因为我的ViewModel可能是在后台线程中创建的,所以我不能只Dispatcher.Current
在ViewModel的构造函数中创建.
我想使用System.Runtime.Caching
命名空间向我的应用程序添加缓存功能,并且可能希望在几个地方和不同的上下文中使用缓存.为此,我想使用几个MemoryCache实例.
但是,我在这里看到不鼓励使用多个MemoryCache实例:
MemoryCache不是单例,但是您应该只创建一些或者可能只创建一个MemoryCache实例,缓存项目的代码应该使用这些实例.
多个MemoryCache实例将如何影响我的应用程序?我发现这种奇怪,因为在我看来,在应用程序中使用多个缓存是一种非常常见的情况.
编辑:更具体地说,我有一个类应该为每个实例保留一个缓存.我应该避免使用MemoryCache
并寻找不同的缓存解决方案吗?MemoryCache
在这种情况下使用是否被认为是坏的,如果是这样,为什么?
我想隐藏(或删除)我的数据网格中所有行(以及随后的单元格)的所有边框,想一个基本的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尝试了相同,但没有骰子,仍然看到边界.
在"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)
这种需要对我来说似乎很疯狂.如何识别出现这种情况的所有可能情况?我认为如果处理器改变了操作顺序,它需要保证行为不会改变.
你还懒得使用障碍吗?
我不确定什么看起来更好,或者我什么时候在抽象类和属性中使用,或何时使用非抽象属性.我将尝试做一个简单的例子.假设我有这个:
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) 我需要通过App.Config文件设置应用程序的文化,以便"pt-BR"自动用于解析日期,而无需为每个操作手动通知文化.
据我所知,有一个globalization
部分可以system.web
在Web.Config文件的部分内定义,但我正在运行一个控制台应用程序,我无法解决这个问题.
任何的想法?
.net ×8
c# ×8
properties ×2
wpf ×2
.net-4.0 ×1
abstract ×1
app-config ×1
async-await ×1
c#-5.0 ×1
caching ×1
class ×1
constructor ×1
datagrid ×1
dispatcher ×1
enum-flags ×1
enums ×1
field ×1
interface ×1
localization ×1
memorycache ×1
mvvm ×1
oop ×1
xaml ×1