我注意到,如果在接口上将参数指定为可选参数,则使用C#4中的可选参数,您不必在任何实现类上使该参数可选:
public interface MyInterface
{
void TestMethod(bool flag = false);
}
public class MyClass : MyInterface
{
public void TestMethod(bool flag)
{
Console.WriteLine(flag);
}
}
Run Code Online (Sandbox Code Playgroud)
因此:
var obj = new MyClass();
obj.TestMethod(); // compiler error
var obj2 = new MyClass() as MyInterface;
obj2.TestMethod(); // prints false
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么可选参数设计为这样工作?
一方面,我认为覆盖接口上指定的任何默认值的能力是有用的,但老实说,我不确定您是否应该能够在接口上指定默认值,因为这应该是一个实现决策.
另一方面,这种断开意味着您不能总是交替使用具体类和接口.当然,如果在实现上指定了默认值,那么这不是问题,但是如果你将具体类作为接口公开(使用一些IOC框架来注入具体的类),那么真的没有具有默认值的点,因为调用者无论如何都必须始终提供它.
为什么构造函数不支持类型推断,就像通用方法一样?
public class MyType<T>
{
private readonly T field;
public MyType(T value) { field = value; }
}
var obj = new MyType(42); // why can't type inference work out that I want a MyType<int>?
Run Code Online (Sandbox Code Playgroud)
虽然你可以用工厂类解决这个问题,
public class MyTypeFactory
{
public static MyType<T> Create<T>(T value)
{
return new MyType<T>(value);
}
}
var myObj = MyTypeFactory.Create(42);
Run Code Online (Sandbox Code Playgroud)
构造函数不支持类型推断是否存在实际或哲学原因?
只是好奇为什么词典不受支持XmlSerializer?
你可以通过使用DataContractSerializer和写入对象来轻松地绕过它XmlTextWriter,但是如果XmlSerializer考虑到它真的是一个KeyValuePairs数组,那么字典的特征是什么使它难以处理.
实际上,你可以传递一个IDictionary<TKey, TItem>期望的方法IEnumerable<KeyValuePairs<TKey, ITem>>.
使用C#中的新async/await关键字,现在会对使用ThreadStatic数据的方式(以及何时)产生影响,因为回调委托在与async启动的操作不同的线程上执行.例如,以下简单的控制台应用程序:
[ThreadStatic]
private static string Secret;
static void Main(string[] args)
{
Start().Wait();
Console.ReadKey();
}
private static async Task Start()
{
Secret = "moo moo";
Console.WriteLine("Started on thread [{0}]", Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("Secret is [{0}]", Secret);
await Sleepy();
Console.WriteLine("Finished on thread [{0}]", Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("Secret is [{0}]", Secret);
}
private static async Task Sleepy()
{
Console.WriteLine("Was on thread [{0}]", Thread.CurrentThread.ManagedThreadId);
await Task.Delay(1000);
Console.WriteLine("Now on thread [{0}]", Thread.CurrentThread.ManagedThreadId);
}
Run Code Online (Sandbox Code Playgroud)
将输出以下内容:
Started on thread [9]
Secret is [moo moo]
Was on thread [9]
Now …Run Code Online (Sandbox Code Playgroud) 如何从MethodBase中找出方法的返回类型?我正在使用PostSharp并尝试覆盖CompileTimeValidate(MethodBase方法)方法以确保该属性应用于具有正确签名的方法.
谢谢,
我正在BinaryFormatter和Protobuf-net序列化器进行一些比较,并对我发现的内容非常满意,但奇怪的是,Protobuf-net设法将对象序列化为比我刚写入值时更小的字节数组.将每个属性转换为没有任何元数据的字节数组.
我知道如果设置AsReference为Protobuf-net支持字符串实习true,但在这种情况下我不是这样做的,那么Protobuf-net默认提供一些压缩吗?
以下是您可以运行以查看的一些代码:
var simpleObject = new SimpleObject
{
Id = 10,
Name = "Yan",
Address = "Planet Earth",
Scores = Enumerable.Range(1, 10).ToList()
};
using (var memStream = new MemoryStream())
{
var binaryWriter = new BinaryWriter(memStream);
// 4 bytes for int
binaryWriter.Write(simpleObject.Id);
// 3 bytes + 1 more for string termination
binaryWriter.Write(simpleObject.Name);
// 12 bytes + 1 more for string termination
binaryWriter.Write(simpleObject.Address);
// 40 bytes for 10 ints
simpleObject.Scores.ForEach(binaryWriter.Write);
// 61 bytes, …Run Code Online (Sandbox Code Playgroud) 我只是想知道是否有人知道你不允许使用隐式或显式运算符的接口的原因?
例如,这会引发编译时错误:
public static explicit operator MyPlayer(IPlayer player)
{
...
}
Run Code Online (Sandbox Code Playgroud)
"不允许在接口之间进行用户定义的转换"
谢谢,
我一直在玩Reactive Extension一段时间,但主要限于处理/编写WPF前端内的用户驱动事件.
这是一种强大的,新的异步编程方式,我很好奇其他人正在做什么,你认为它可以改善我们目前做事的方式?
我在使用jquery将一些json数据发布到我在WCF服务上的rest方法时遇到了一些麻烦.
在WCF方面,这是操作合同:
[OperationContract]
[WebInvoke(Method = "POST",
BodyStyle = WebMessageBodyStyle.Bare,
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "PostSomething")]
MyResult PostSomething(MyRequest request);
Run Code Online (Sandbox Code Playgroud)
双方MyResult并MyRequest标有所有必要DataContract和DataMember属性和服务暴露WebHttp端点.
在JQuery方面,这是我的函数调用:
var jsonStr = JSON.stringify(reqObj);
$.ajax({
type: "POST",
dataType: "json",
url: "http://localhost/MyService/PostSomething",
contentType: "application/json; charset=utf-8",
data: jsonStr,
success: function (html) {
alert(html);
}
});
Run Code Online (Sandbox Code Playgroud)
这个请求永远不会到达我的方法(我每次都得到一个405方法不允许),并查看Charles的请求如下所示:
OPTIONS /MyService/PostSomething HTTP/1.1
Host: localhost
Cache-Control: max-age=0
Access-Control-Request-Method: POST
Origin: null
Access-Control-Request-Headers: Content-Type, Accept
Accept: */*
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 …Run Code Online (Sandbox Code Playgroud) 当您在C#中调用Func委托(或Action代理)上的BeginInvoke方法时,运行时是否使用ThreadPool或生成新线程?
我几乎可以肯定它会使用ThreadPool,因为这是合乎逻辑的事情,但如果有人能证实这一点,我会很感激.
谢谢,
c# ×8
.net ×5
async-await ×1
asynchronous ×1
c#-4.0 ×1
constructor ×1
delegates ×1
dictionary ×1
explicit ×1
generics ×1
interface ×1
jquery ×1
postsharp ×1
protobuf-net ×1
reflection ×1
rest ×1
wcf ×1
xml ×1