相关疑难解决方法(0)

单身人士有什么不好的?

单例模式是一个缴足成员四人帮模式书,但最近似乎而是由开发者世界孤立.我仍然使用相当多的单例,特别是对于工厂类,虽然你必须对多线程问题(实际上是任何类)有点小心,但我不明白为什么它们如此可怕.

Stack Overflow特别假设每个人都同意Singletons是邪恶的.为什么?

请用" 事实,参考或特定专业知识 " 支持您的答案

singleton design-patterns

1931
推荐指数
30
解决办法
48万
查看次数

使用lambdas进行惰性字段初始化

我想在没有if语句的情况下实现惰性字段初始化(或延迟初始化)并利用lambdas.所以,我想具有以下Foo属性的相同行为,但没有if:

class A<T>{
    private T fooField;

    public T getFoo(){
        if( fooField == null ) fooField = expensiveInit();
        return fooField;
    }
}
Run Code Online (Sandbox Code Playgroud)

忽略这个解决方案不能保证安全使用的事实:1)多线程; 2)null作为有效值T.

因此,为了表达初始化fooField被推迟到第一次使用的意图,我想声明fooField类型Supplier<T>如下:

class A<T>{
   private Supplier<T> fooField = () -> expensiveInit();

   public T getFoo(){
      return fooField.get();
   }
}
Run Code Online (Sandbox Code Playgroud)

然后在getFoo财产中我会回来fooField.get().但是现在我想要对getFoo属性的下一次调用避免expensiveInit()并且只返回前一个T实例.

如何在不使用的情况下实现这一目标if

尽管命名约定并替换了->by =>,但是这个例子也可以在C#中考虑.但是,.NET Framework版本4已经提供了Lazy<T>所需的语义.

lambda lazy-initialization java-8

46
推荐指数
5
解决办法
3万
查看次数

F# - 没有参数的函数?

在思考功能性思维模式时,假设函数应该是纯粹的,那么可以断定任何没有参数的函数基本上只是一个值.
然而,reallity阻碍了,并且对于不同的输入,我可能不需要某个函数,并且如果该函数在计算上是昂贵的,那么如果不需要它我不想评估它.
我找到了一个解决方法,使用let func _ = ...func 1或其他任何东西来调用它,但这对读者来说非常非惯用且令人困惑.

这归结为一个问题:在F#中,是否有一种正确的方法来声明一个零参数的函数,而没有在声明中进行评估?

f# functional-programming unit-type

35
推荐指数
2
解决办法
6198
查看次数

为什么ConcurrentDictionary.GetOrAdd(key,valueFactory)允许调用valueFactory两次?

我使用并发字典作为线程安全的静态缓存,并注意到以下行为:

来自GetOrAdd上的MSDN文档:

如果在不同的线程上同时调用GetOrAdd,可能会多次调用addValueFactory,但是对于每个调用,它的键/值对可能不会添加到字典中.

我希望能够保证工厂只被召唤一次.有没有办法使用ConcurrentDictionary API执行此操作而不依赖于我自己的单独同步(例如锁定valueFactory)?

我的用例是valueFactory在动态模块中生成类型,所以如果同一个键的两个valueFactories同时运行,我点击:

System.ArgumentException: Duplicate type name within an assembly.

c# concurrency multithreading caching concurrentdictionary

26
推荐指数
2
解决办法
5796
查看次数

多线程应用程序中没有锁的延迟加载

如果两个线程同时读取此属性会发生什么?

public static HugeType HugeType
{
    get
    {
        if (tenderCache == null)
        {
            tenderCache = Config.Get<HugeType>("HugeType", null);
        }
        return tenderCache;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的对象是只读的,如果创建了两个实例,则它并不重要.在任何情况下我都应该添加锁吗?

.net c# multithreading thread-safety

10
推荐指数
1
解决办法
529
查看次数

我们有没有理由在Directory.EnumerateFiles()上使用Directory.GetFiles()?

我不知道为什么我们会使用它Directory.GetFiles,如果Directory.EnumerateFiles能够做同样的事情,你甚至可以在返回找到的整个目录列表之前枚举列表.

Directory.EnumerateFiles与Directory.GetFiles有什么区别?

为什么,现在EnumerateFiles有可能需要使用GetFiles

c#

6
推荐指数
2
解决办法
5876
查看次数

什么是懒惰的实例化

懒惰的实例化是关于使用更少的代码但得到相同的结果?当然,这通常是一件好事(提供简短/高效的代码不会损害可读性/可维护性).

请参考这个懒惰的实例:

public sealed class Singleton
{
    private Singleton()
    {
    }

    public static Singleton Instance { get { return Nested.instance; } }

    private class Nested
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Nested()
        {
        }

        internal static readonly Singleton instance = new Singleton();
    }
} 
Run Code Online (Sandbox Code Playgroud)

Instance(我知道它是隐含的)没有私有财产- 它是否使它变得懒惰 - 事实上我们在public static Singleton Instance财产中没有设置者?

c# lazy-initialization

5
推荐指数
3
解决办法
4069
查看次数

简单的SELECT WHERE LINQ查询到列表

我是LINQ的新手,

我想从dbcontext生成一个对象列表,其中某个字段设置为true.

这是我到目前为止,但我得到一个关于选择的错误?

using (var db = new dbContext())
{
    return (from s in db.sims.Where(x=>x.has_been_modified == true) select x).ToList();               
}
Run Code Online (Sandbox Code Playgroud)

编辑:

    //Returns a list of entries which where marked as edited in the sim managment database
    private List<String> GetUpdatedEntries()
    {
        using (var db = new dbContext())
        {
            return db.sims.Where(x => x.has_been_modified).ToList();                  
        }
    }
Run Code Online (Sandbox Code Playgroud)

c# linq entity-framework

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

在 C# 中重现十进制的撕裂读取

眼见为实。任何人都可以重现读取撕裂的小数的程序吗?我尝试旋转多个线程,在 1 和 2 之间更改相同的小数。我没有捕获任何与 1 或 2 不同的读取。

我希望看到读取器线程看不到写入器线程的原子更改,因此该值应该与 1 或 2 不同。

void TornDecimalReadTest()
{
    decimal sharedDecimal = 1;
    int threadCount = 100;
    var threads = new List<Thread>();

    for (int i = 0; i < threadCount; i++)
    {
        int threadId = i;
        var thread = new Thread(() =>
        {
            Thread.Sleep(5000);

            decimal newValue = threadId % 2 == 0 ? 1 : 2;
            bool isWriterThread = threadId % 2 == 0;

            Console.WriteLine("Writer : " + isWriterThread +
                " - …
Run Code Online (Sandbox Code Playgroud)

c# atomic thread-safety lock-free

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

加载属性延迟加载

我有一个属性,getter应该只在第一次加载它的值.第二次返回加载的值而不再加载它:

private Object _MemberValue;

public Object MemberValue
{
    get
    {
        if(_MemberValue == null)
        {
            _MemberValue = LoadMember();
        }

        return _MemberValue;
    }
}
Run Code Online (Sandbox Code Playgroud)

在VB.NET中有Static关键字.有了它,您不必声明一个类宽成员.

Public Property MemberValue as Object
    Get
        Static value as Object = Nothing

        If (value is Nothing) Then
            value = LoadMember()
        End If

        Return value
    End Get
End Property
Run Code Online (Sandbox Code Playgroud)

在C#中没有这样的关键字.

是否有更好的C#实现此问题或其他模式?

c# vb.net design-patterns lazy-evaluation

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

任务==懒惰?

public Data GetCurrent(Credentials credentials)
{ 
    var data = new Lazy<Data>(() => GetCurrentInternal(credentials));
    try
    {
        return data.Value;
    }
    catch (InvalidOperationException ex)
    {
        throw ex.InnerException;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我将呼叫更改为以下内容:

var data = new Task<Data>(() => GetCurrentInternal(credentials));
Run Code Online (Sandbox Code Playgroud)

有什么变化吗?我宁愿TaskLazy?怎么样Dispose()catch(Exception)

.net c#

3
推荐指数
2
解决办法
1443
查看次数

C#:我应该对每个相关属性使用延迟加载吗?

我正在研究延迟加载。我不明白延迟加载是如何工作的,我应该做些什么来改变它吗?

\n

这是我的第一个案例:我有User,User rolesRoles类。用户与角色具有多对多的关系。所以我创建了用户角色类来处理这种关系。User 不包含所有情况的角色(不要介意IdUserRole)。

\n

用户

\n
public class User : IUser\n{\n    public bool IsActive { get; set; }\n    public int Id { get; private set; }\n    public string Email { get; set; }\n    public byte[] PasswordHash { get; set; }\n    public byte[] PasswordSalt { get; set; }\n    public string? Phone { get; set; }\n\n    public List<UserRole> UserRoles { get; set; }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

用户角色

\n
public class UserRole : …
Run Code Online (Sandbox Code Playgroud)

.net c# linq entity-framework lazy-loading

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