我想在没有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>所需的语义.
在思考功能性思维模式时,假设函数应该是纯粹的,那么可以断定任何没有参数的函数基本上只是一个值.
然而,reallity阻碍了,并且对于不同的输入,我可能不需要某个函数,并且如果该函数在计算上是昂贵的,那么如果不需要它我不想评估它.
我找到了一个解决方法,使用let func _ = ...func 1或其他任何东西来调用它,但这对读者来说非常非惯用且令人困惑.
这归结为一个问题:在F#中,是否有一种正确的方法来声明一个零参数的函数,而没有在声明中进行评估?
我使用并发字典作为线程安全的静态缓存,并注意到以下行为:
如果在不同的线程上同时调用GetOrAdd,可能会多次调用addValueFactory,但是对于每个调用,它的键/值对可能不会添加到字典中.
我希望能够保证工厂只被召唤一次.有没有办法使用ConcurrentDictionary API执行此操作而不依赖于我自己的单独同步(例如锁定valueFactory)?
我的用例是valueFactory在动态模块中生成类型,所以如果同一个键的两个valueFactories同时运行,我点击:
System.ArgumentException: Duplicate type name within an assembly.
如果两个线程同时读取此属性会发生什么?
public static HugeType HugeType
{
get
{
if (tenderCache == null)
{
tenderCache = Config.Get<HugeType>("HugeType", null);
}
return tenderCache;
}
}
Run Code Online (Sandbox Code Playgroud)
我的对象是只读的,如果创建了两个实例,则它并不重要.在任何情况下我都应该添加锁吗?
我不知道为什么我们会使用它Directory.GetFiles,如果Directory.EnumerateFiles能够做同样的事情,你甚至可以在返回找到的整个目录列表之前枚举列表.
Directory.EnumerateFiles与Directory.GetFiles有什么区别?
为什么,现在EnumerateFiles有可能需要使用GetFiles?
懒惰的实例化是关于使用更少的代码但得到相同的结果?当然,这通常是一件好事(提供简短/高效的代码不会损害可读性/可维护性).
请参考这个懒惰的实例:
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财产中没有设置者?
我是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) 眼见为实。任何人都可以重现读取撕裂的小数的程序吗?我尝试旋转多个线程,在 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) 我有一个属性,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#实现此问题或其他模式?
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)
有什么变化吗?我宁愿Task过Lazy?怎么样Dispose()和catch(Exception)?
我正在研究延迟加载。我不明白延迟加载是如何工作的,我应该做些什么来改变它吗?
\n这是我的第一个案例:我有User,User roles和Roles类。用户与角色具有多对多的关系。所以我创建了用户角色类来处理这种关系。User 不包含所有情况的角色(不要介意IdUserRole)。
用户
\npublic 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}\nRun Code Online (Sandbox Code Playgroud)\n用户角色
\npublic class UserRole : …Run Code Online (Sandbox Code Playgroud)