使用C#/ .NET 4.0,Lazy<T>可以如下声明对象.
using System;
using System.Threading;
...
var factory = () => { return new object(); };
var lazy = new Lazy<object>(factory, LazyThreadSafetyMode.ExecutionAndPublication);
Run Code Online (Sandbox Code Playgroud)
LazyThreadSafetyMode枚举中的其他选项是PublicationOnly和None.
为什么没有ExecutionOnly选择?
在这种情况下的行为是,即使多个线程试图获取,工厂方法最多只被一个线程调用一次lazy.Value.一旦工厂方法完成并且单个结果被缓存,许多线程将能够同时访问lazy.Value(即,在初始工厂方法之后没有线程安全性).
我使用的是C#/ .NET 4.0和一个Protocol Buffers库(protobuf-net),它提供了以下功能.
public static class Serializer {
public static void Serialize<T>(Stream destination, T instance);
public static void Serialize<T>(SerializationInfo info, T instance);
public static void Serialize<T>(XmlWriter writer, T instance);
public static void Serialize<T>(SerializationInfo info, StreamingContext context, T instance);
public static T Deserialize<T>(Stream source);
}
Run Code Online (Sandbox Code Playgroud)
我需要使用非泛型等价物包装其中两个调用.具体来说,我想要
void SerializeReflection(Stream destination, object instance);
object DeserializeReflection(Stream source, Type type);
Run Code Online (Sandbox Code Playgroud)
它只是Serializer在运行时调用相应的通用成员.我已经得到了DeserializeReflection使用以下代码的方法:
public static object DeserializeReflection(Stream stream, Type type)
{
return typeof(Serializer)
.GetMethod("Deserialize")
.MakeGenericMethod(type)
.Invoke(null, new object[] { stream …Run Code Online (Sandbox Code Playgroud) 使用C#,我如何获取两个枚举值的最小值或最大值?
例如,如果我有
enum Permissions
{
None,
Read,
Write,
Full
}
Run Code Online (Sandbox Code Playgroud)
在那里,让我做的方法Helper.Max(Permissions.Read, Permissions.Full),并得到Permissions.Full,例如?
这个问题是我最近一个问题的延续:
当使用lambda作为模板参数时,这个编译器错误是什么?
2014年11月11日:微软已经回应说这个bug的修复程序应该出现在Visual C++的下一个主要版本中.
此代码无法使用VS2012(Update 2)进行编译:
int main(int argc, char* argv[])
{
auto f = []()
{
int n = 0;
auto r = [=]{ return n; };
return r;
};
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的编译器错误:
1> main.cpp
1>C:\test\main.cpp(7): error C2440: 'return' : cannot convert from 'main::<lambda_c5d1d707b91a1ddedc06eb080503550c>::()::<lambda_ac357c309731f4971c3269160ed9c24b>' to 'int (__cdecl *)(void)'
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
Run Code Online (Sandbox Code Playgroud)
r是 …考虑以下设置:
class A { public int x; }
class B { public int y; }
static class Helper
{
public static Expression<Func<B>> BindInput(
Expression<Func<A, B>> expression,
A input)
{
//TODO
}
}
static void Main(string[] args)
{
Expression<Func<B>> e = Helper.BindInput(
(A a) => new B { y = a.x + 3 },
new A { x = 4 });
Func<B> f = e.Compile();
Debug.Assert(f().y == 7);
}
Run Code Online (Sandbox Code Playgroud)
我想要在该方法中做的BindInput是将表达式转换为input嵌入其中。在 中的示例用法中Main,结果表达式e将是
() => …Run Code Online (Sandbox Code Playgroud) 根据我的理解,追加::到命名空间的前面是指全局命名空间,而不管任何using语句或父命名空间.如果是这种情况,并且我没有误解任何内容,那么为什么这样的代码会编译(至少在Visual Studio中):
namespace Foo {
namespace Bar {
class X;
}
}
using namespace Foo;
int main(void)
{
::Bar::X x;
}
Run Code Online (Sandbox Code Playgroud) 我有一对(闭合的)多边形,每个多边形定义为一系列点(顶点).多边形各自代表由小河分隔的土地图,因此溪流在两个多边形之间形成狭窄的间隙.
我正在寻找一种算法,通过将两个多边形连接成一个连接的多边形来识别和消除间隙.
下图显示了一个示例,其中原始多边形为绿色和红色,生成的多边形以黄色显示.

到目前为止,我已经能够做到以下几点:
但我不确定我现在需要做什么.
我刚开始使用ASP.NET Web API 2.1并遇到了限制.使用属性路由,我可以执行以下操作:
[Route("item/{id:int}")]
public IHttpActionResult GetItem(int id)
{
...
}
Run Code Online (Sandbox Code Playgroud)
URL /item/5将被路由到此操作,但/item/abc由于int约束,URL 不会{id:int}.
我尝试更改我的URL,以便id参数在查询字符串及其约束中,尽管在查询参数上使用的路由约束从未在文档中提及或演示过.
[Route("item?{id:int}")]
public IHttpActionResult GetItem(int id)
{
...
}
Run Code Online (Sandbox Code Playgroud)
如果我现在尝试运行,我会在Configure方法调用中出错Application_Start.
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
Run Code Online (Sandbox Code Playgroud)
消息如下.
用户代码未处理ArgumentException
路径模板不能以'/'或'〜'字符开头,也不能包含'?' 字符.
有两件事让我烦恼不已.
首先,在MSDN上记录路由前缀的部分清楚地表明~,在路径模板的开头放置一个字符是完全可以接受的.我试过了,它的工作原理记录在案.
其次,如果不是这样,我如何在查询参数上放置路由约束?考虑以下情况,删除路径约束.
[Route("item")]
public IHttpActionResult GetItem(int id)
{
...
}
Run Code Online (Sandbox Code Playgroud)
该URL /item/5将被路由到这个行动,id设置为5-但这样会将该网址/item/abc,与id设置为0.
是否无法对查询参数设置路由约束?
我的代码库中有一些相当复杂的实体框架查询,我决定将逻辑集中到模型中.基本上,描绘了一堆控制器,它们在表达式树中有大量查询和大量重复代码.因此,我取出了部分表达树并将它们移动到模型中,从而减少了重复次数.
例如,假设我经常需要获取名为Entity的模型,这些模型处于Not Deleted状态.在我的实体模型上,我有:
public static Func<Entity, bool> IsNotDeleted = e =>
e.Versions != null ?
e.Versions.OrderByDescending(v => v.VersionDate).FirstOrDefault() != null ?
e.Versions.OrderByDescending(v => v.VersionDate).First().ActivityType != VersionActivityType.Delete :
false :
false;
Run Code Online (Sandbox Code Playgroud)
(这是较小的示例之一,主要是在尝试检查数据之前检查有效数据.)
使用它看起来像:
var entities = EntityRepository.Entities.Where(Entity.IsNotDeleted).Where(...
Run Code Online (Sandbox Code Playgroud)
但是我发现,虽然有时候我想这是不会被删除的记录,其他时间我想要的记录被删除.要做到这一点,有没有办法从消费代码中反转逻辑?概念上类似于此的东西(显然不起作用):
var entities = EntityRepository.Entities.Where(!Entity.IsDeleted).Where(...
Run Code Online (Sandbox Code Playgroud)
我宁愿不在Func<>物体上有两个,一个用于IsDeleted,另一个IsNotDeleted几乎相同.的Func<>回报bool,是否有语法把一个在当它调用它的逆.Where()条款?
请考虑以下接口和实现.
interface IService
{
Task<string> GetAnswer(string question);
}
class SomeService : IService
{
async Task<string> IService.GetAnswer(string question)
{
... code using awaits ...
}
}
class AnotherService : IService
{
Task<string> IService.GetAnswer(string question)
{
return Task.FromResult("I have no idea.");
}
}
Run Code Online (Sandbox Code Playgroud)
根据Microsoft命名约定,接口方法应该命名GetAnswer还是GetAnswerAsync?
按照惯例,您将"Async"附加到具有Async或async修饰符的方法的名称.
问题是第一个实现使用async修饰符,表明它应该接收"Async"方法名称后缀,但第二个实现不使用async修饰符,表明它不应该接收"Async"方法名称后缀.实现中的两个方法名称被接口强制相同,因此我不得不违反两个类之一的命名约定.
注意我不是在寻找自以为是的答案.考虑多选.:)