小编Tim*_*lds的帖子

System.Lazy <T>和System.Threading.LazyThreadSafetyMode枚举

使用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枚举中的其他选项是PublicationOnlyNone.

为什么没有ExecutionOnly选择?

在这种情况下的行为是,即使多个线程试图获取,工厂方法最多只被一个线程调用一次lazy.Value.一旦工厂方法完成并且单个结果被缓存,许多线程将能够同时访问lazy.Value(即,在初始工厂方法之后没有线程安全性).

c# .net-4.0 lazy-initialization

5
推荐指数
1
解决办法
745
查看次数

使用System.Type调用泛型方法

我使用的是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)

.net c# generics system.reflection

5
推荐指数
1
解决办法
1754
查看次数

枚举值的最小和最大操作

使用C#,我如何获取两个枚举值的最小值或最大值?

例如,如果我有

enum Permissions
{
    None,
    Read,
    Write,
    Full
}
Run Code Online (Sandbox Code Playgroud)

在那里,让我做的方法Helper.Max(Permissions.Read, Permissions.Full),并得到Permissions.Full,例如?

c#

5
推荐指数
1
解决办法
5805
查看次数

Lambda返回lambda错误地推断返回类型?

这个问题是我最近一个问题的延续:
当使用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)
  • 根据C++ 11规范,代码是否有问题?
  • 根据VS2012定义的部分C++ 11支持,代码是否存在问题?
  • 或者这是VS2012 C++编译器错误?

  • 有人能指出我在C++ 11规范中讨论lambdas必须如何隐式转换为函数指针的地方吗?
    • 我记得这仅是为无状态的lambda -那些空捕捉条款-其中内部拉姆达r是 …

c++ compiler-construction lambda c++11 visual-studio-2012

5
推荐指数
1
解决办法
847
查看次数

System.Linq.Expressions:在运行时绑定 LambdaExpression 输入

考虑以下设置:

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)

.net c#

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

关于C++全局命名空间的困惑

根据我的理解,追加::到命名空间的前面是指全局命名空间,而不管任何using语句或父命名空间.如果是这种情况,并且我没有误解任何内容,那么为什么这样的代码会编译(至少在Visual Studio中):

namespace Foo {
    namespace Bar {
        class X;
    }
}

using namespace Foo;
int main(void)
{
    ::Bar::X x;
}
Run Code Online (Sandbox Code Playgroud)

c++ scope namespaces

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

结合附近的多边形

我有一对(闭合的)多边形,每个多边形定义为一系列点(顶点).多边形各自代表由小河分隔的土地图,因此溪流在两个多边形之间形成狭窄的间隙.

我正在寻找一种算法,通过将两个多边形连接成一个连接的多边形来识别和消除间隙.

下图显示了一个示例,其中原始多边形为绿色和红色,生成的多边形以黄色显示.

例

到目前为止,我已经能够做到以下几点:

  • 对于polygon-A中的每条边,在polygon-B中找到最近的顶点.
  • 找到polygon-B的所有顶点,这些顶点位于polygon-A的特定距离内.

但我不确定我现在需要做什么.

algorithm geometry polygon

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

查询参数路由约束

我刚开始使用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.

是否无法对查询参数设置路由约束?

c# asp.net asp.net-web-api-routing asp.net-web-api2

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

逻辑逆Func <T,bool>

我的代码库中有一些相当复杂的实体框架查询,我决定将逻辑集中到模型中.基本上,描绘了一堆控制器,它们在表达式树中有大量查询和大量重复代码.因此,我取出了部分表达树并将它们移动到模型中,从而减少了重复次数.

例如,假设我经常需要获取名为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()条款?

c# linq func expression-trees linq-expressions

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

方法返回任务的接口命名约定

请考虑以下接口和实现.

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"方法名称后缀.实现中的两个方法名称被接口强制相同,因此我不得不违反两个类之一的命名约定.

注意我不是在寻找自以为是的答案.考虑多选.:)

  1. 您应该使用"Async"后缀,因为命名约定会这样说.(供参考.)
  2. 您不应该使用"Async"后缀,因为命名约定会这样说.(供参考.)
  3. 命名约定没有说.(这需要来自精通他们的人.)

.net c# interface naming-conventions async-await

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