我一直在寻找.net(c#)的日志框架,并决定在阅读stackoverflow上的一些问题/答案线程后给log4net一个机会.我看到人们一遍又一遍地提到他们使用log4net的包装类,我很想知道它会是什么样子.
我将我的代码拆分为不同的项目(数据访问/业务/ webservice/..).log4net包装器类怎么样?包装类是否需要包含在所有项目中?我应该将它作为一个单独的项目一起构建吗?
包装器应该是单件类吗?
在.NET 4.5/C#5中,IReadOnlyCollection<T>使用Count属性声明:
public interface IReadOnlyCollection<out T> : IEnumerable<T>, IEnumerable
{
int Count { get; }
}
Run Code Online (Sandbox Code Playgroud)
我想知道,ICollection<T>实现IReadOnlyCollection<T>接口也没有意义:
public interface ICollection<T> : IEnumerable<T>, IEnumerable, *IReadOnlyCollection<T>*
Run Code Online (Sandbox Code Playgroud)
这意味着实现的类ICollection<T>将自动实现IReadOnlyCollection<T>.这对我来说听起来很合理.
的ICollection<T>抽象可以被看作是所述的扩展IReadOnlyCollection<T>抽象.请注意List<T>,例如,实现两者ICollection<T>和IReadOnlyCollection<T>.
然而,它并没有这样设计.
我在这里错过了什么?为什么要选择当前的实现呢?
UPDATE
我正在寻找一个使用面向对象设计推理来解释原因的答案:
List<T>实现IReadOnlyCollection<T> 和 ICollection<T>是一个比以下更好的设计:
ICollection<T>IReadOnlyCollection<T>直接实施另请注意,这基本上与以下问题相同:
IList<T>实施IReadOnlyList<T>?IDictionary<T>实施IReadOnlyDictionary<T>?在我看来,当你创建一个Mongo文档并且有一个{key, value}有时没有值的字段时,你有两个选择:
{key, null}即在字段中写入空值这两个选项都很容易查询,您可以在其中查询,{key : null}另一个查询{key : {$exists : false}}.
我真的不能想到在应用程序场景中会产生任何影响的两个选项之间的任何差异(除了选项2的存储略少).
任何人都可以告诉我,如果有任何理由,人们会更喜欢这两种方法中的任何一种,为什么呢?
编辑
在提出问题之后,我也发现在这两种情况下索引可能表现不同,即可以为选项2创建稀疏索引,但我仍然试图比较并理解两种方法中完整索引的考虑因素.
我需要在一组有限的字符串的基础上在一个区域中创建一个临界区.我希望为同一个字符串实例共享锁(有点类似于String.Intern方法).
我正在考虑以下实施:
public class Foo
{
private readonly string _s;
private static readonly HashSet<string> _locks = new HashSet<string>();
public Foo(string s)
{
_s = s;
_locks.Add(s);
}
public void LockMethod()
{
lock(_locks.Single(l => l == _s))
{
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法有什么问题吗?以这种方式锁定字符串对象是否可以,并且在使用时是否存在任何线程安全问题HashSet<string>?
例如,创建一个Dictionary<string, object>为每个字符串实例创建一个新的锁对象是否更好?
最终实施
根据我的建议,我采用了以下实现:
public class Foo
{
private readonly string _s;
private static readonly ConcurrentDictionary<string, object> _locks = new ConcurrentDictionary<string, object>();
public Foo(string s)
{
_s = s;
}
public void …Run Code Online (Sandbox Code Playgroud) 我正在实现一个处理很多字段的联系人数据库.它们中的大多数是预定义的,可以被认为是绑定的,但有一些不是.我们会称其中一个字段为"群组".我们目前实现它的方式是(每个文档/联系人都有'groups'字段):
'groups' : {
152 : 'hi',
111 : 'group2'
}
Run Code Online (Sandbox Code Playgroud)
但经过一些阅读后,我觉得我应该这样做:
'groups' : [
{ 'id' : 152, 'name' : 'hi' },
{ 'id' : 111, 'name' : 'group2' }
...
]
Run Code Online (Sandbox Code Playgroud)
然后应用索引 db.contact.ensureIndex({'groups.id':1});
我的问题是关于功能.两个结构之间有什么区别?如何实际构建索引(它只是在每个文档/联系人中编制索引,还是构建一个包含所有文档/联系人的所有组的完整索引?).
我有点假设这是结构上最好的方式,但如果我不对,请告诉我.
您的行动签名中是否有使用以下两种备选方案的优点/缺点:
public ActionResult Action(int? x) // get MVC to bind null when no parameter is provided
{
if(x.HasValue)
{
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
要么
public ActionResult Action(int? x = null) // C# optional parameter (virtual overload)
{
if(x.HasValue)
{
// do something
}
}
Run Code Online (Sandbox Code Playgroud) 我遇到了以下代码:
var collection = new Collection<string>();
Run Code Online (Sandbox Code Playgroud)
我没有看到Collection类使用太多,也找不到太多关于它的用途的信息.查看.NET Framework源代码,它几乎只是List的包装器,因为它存储了List成员字段.它的构造函数如下:
public Collection()
{
this.items = (IList<T>) new List<T>();
}
Run Code Online (Sandbox Code Playgroud)
它还实现了IList.所以你可以将Collection声明为:
IList<string> collection = new Collection<string>();
Run Code Online (Sandbox Code Playgroud)
对我来说,在功能上等同于创建一个List:
IList<string> collection = new List<string>();
Run Code Online (Sandbox Code Playgroud)
那么你什么时候想在你自己的代码中使用它?我看到它是其他.NET集合的基类,但为什么它们将它作为公共具体(而不是内部和/或抽象)包含在内?
关于可能重复的注释 - 相关问题的答案似乎表明Collection类应该用作基类.我真正要求的不同之处是:
说我有一个物品文件:price和:qty字段.我有时想要找到与给定匹配的所有文件:price AND:qty,而在其他时候它将是:价格本身或:qty本身.
我已经索引了:price和:qty键,但是我还需要在两者上创建复合索引,还是单键索引足够?
编辑:我在mongodb网站上发现这篇文章非常有用:
在mongodb中创建索引时,可以指定background: true标志,这会导致索引创建为非阻塞.这在生产中非常棒,因为您不希望在创建一个之前显然不需要的索引时锁定整个数据库(因为您没有它).
阅读文档,似乎这个标志只决定了索引是如何创建的,一旦构建完毕,索引的行为就像普通索引一样.这就是我想要的 - 我不希望索引与文档不同步,因为它在后台更新,尽管我可以想象一个数据库可以做到这一点.
我在这里问,因为该getIndexes命令显示索引background在创建后仍然标记为.这只是提醒它是如何创建的吗?或者background索引在创建后表现不同?也许复制有些微妙?
我不确定我是否正确理解稀疏索引.
我在fbId上有一个稀疏的唯一索引
{
"ns" : "mydb.users",
"key" : {
"fbId" : 1
},
"name" : "fbId_1",
"unique" : true,
"sparse" : true,
"background" : false,
"v" : 0
}
Run Code Online (Sandbox Code Playgroud)
而且我期望这会允许我插入带有null的记录作为fbId,但是会抛出重复的键异常.它只允许我在完全删除fbId属性时插入.
是不是应该处理的稀疏指数?