小编Dan*_*Tao的帖子

如何实现像.NET的ConcurrentBag <T>这样的类?

我发现自己ConcurrentBag<T>对即将推出的.NET 4.0框架中的类的存在非常感兴趣:

当订购无关紧要时,袋子可用于存放物品,与套装不同,袋子支持重复.

我的问题是:这个想法如何实施?大多数集合我熟悉基本量(引擎盖下)某种形式的阵列,其中为了不得"的事情,"但有一个订单(这就是为什么,尽管它并不需要,枚举几乎总是要经过一个不变的集合,可以是List,Queue,Stack,等以相同的顺序).

如果我不得不猜测,我可能会建议在内部它可能是一个Dictionary<T, LinkedList<T>>; 但实际上这似乎是非常可疑的,因为将任何类型T用作关键都没有意义.

我期待/希望的是,这实际上是一个已经在某处被"弄清楚"的既定对象类型,并且知道这种已建立类型的人可以告诉我它.这对我来说太不寻常了 - 其中一个概念在现实生活中很容易理解,但很难转化为可用的类作为开发人员 - 这就是为什么我对可能性感到好奇.

编辑:

一些响应者建议a Bag可以是内部哈希表的一种形式.这也是我最初的想法,但我预见到这个想法有两个问题:

  1. 当您没有针对相关类型的合适哈希码函数时,哈希表并不是那么有用.
  2. 简单地跟踪对象在集合中的"计数"与存储对象不同.

正如Meta-Knight建议的那样,也许一个例子可以使这更清楚:

public class ExpensiveObject() {
    private ExpensiveObject() {
        // very intense operations happening in here
    }

    public ExpensiveObject CreateExpensiveObject() {
        return new ExpensiveObject();
    }
}

static void Main() {
    var expensiveObjects = new ConcurrentBag<ExpensiveObject>();

    for (int i = 0; i < 5; i++) {
        expensiveObjects.Add(ExpensiveObject.CreateExpensiveObject()); …
Run Code Online (Sandbox Code Playgroud)

.net language-agnostic collections bag

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

为什么我收到错误"db_name必须是字符串或符号"?

快速版本(对于那些熟悉Mongoid西纳特拉):如果它是不是/SYCK YAML的解析问题,为什么别人可以,我得到尝试连接到使用Mongoid MongoDB数据库时,这个错误?(或者也许就是那个问题,在这种情况下,如何修复我的mongoid.yml文件,发布在下面?)


更详细(原始)版本:

我有一个Sinatra应用程序通过Mongoid与MongoDB数据库交互:

configure do
    Mongoid.load!('config/mongoid.yml')
end
Run Code Online (Sandbox Code Playgroud)

我的mongoid.yml文件看起来像这样:

development:
    host: localhost
    database: project_development

test:
    host: localhost
    database: project_test

production:
    uri: <%= ENV['MONGOLAB_URI'] %>
Run Code Online (Sandbox Code Playgroud)

每当我尝试以某种方式与数据库交互时,我得到错误db_name必须是字符串或符号.

现在,我在谷歌上发现了大量有关此事的信息; 但我能找到的一切似乎表明问题与Ruby有关,现在使用Psyche YAML解析器而不是旧的Syck解析器.我不认为这在我的案例中实际上是相关的,因为据我所知,上述YAML应该可以完全解析.

(对于它的价值,不过,我已经使用了试图YAML::ENGINE.yamler= 'syck'伎俩,都无济于事.我得到了确切的相同的错误消息.)

当我将配置更改为:

Mongoid.configure do |config|
    name = "project_development"
    host = "localhost"
    config.master = Mongo::Connection.new.db(name)
end
Run Code Online (Sandbox Code Playgroud)

......然后一切正常.所以我知道MongoDB正在我的机器上工作.特别是当我使用YAML文件时出现问题.

什么给出了什么?

yaml sinatra mongodb mongoid

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

Nullable <Int32>的大小是多少?

所以,实际上有两个问题:

  1. An int(Int32)被指定为(显然)32位.怎么样int?(Nullable<int>)?我的直觉告诉我,对于整数,它将是32位,加上布尔值的8位,但实现可能比这更复杂.
  2. 我会回答我自己的问题sizeof(int?); 但是作为int?托管类型,这是不允许的.我知道类型的大小可能与平台有关,而对于包含对其他对象的引用的对象,类似sizeof的操作会产生误导.但是,在给定当前环境的情况下,是否有办法获得托管类型的"基线"大小(即,新实例化实例的大小)?

.net int boolean nullable sizeof

11
推荐指数
2
解决办法
1191
查看次数

格式化动态生成的HTML - 没人关心?

非常的web开发经验不多,所以这可能是一个非常基本的问题.

这只是从有限的经验,我有(一点点PHP,和一点点的Ruby on Rails的),似乎这样动态生成HTML的格式只是"不要紧"; 它最终变得难看,带有奇怪的缩进,并且没有人关心,因为这不是用户看到的.

当然,除非用户是开发人员,或者甚至只是想要查看一些HTML以尝试学习某些东西的人.

也许你不知道我在说什么; 所以让我举个例子.

在Ruby文件中,我可能有这样的代码:

<h1>Heading</h1>

<div>
    <%= render :partial => '/layouts/body' %>
</div>
Run Code Online (Sandbox Code Playgroud)

然后,在我的"/layouts/_body.html.erb"文件中,我可能会这样:

<p>Here is some content!</p>

<ul>
    <li>List item 1</li>
    <li>List item 2</li>
    <li>List item 3</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

当所有这些都被渲染时,它看起来会很好.但是如果用户试图查看源代码,HTML看起来会很糟糕:

    <h1>Heading</h1>

    <div>
        <p>Here is some content!</p>

<ul>
    <li>List item 1</li>
    <li>List item 2</li>
    <li>List item 3</li>
</ul>

    </div>
Run Code Online (Sandbox Code Playgroud)

显然,这不是什么大问题.我完全可以理解流行的观点是否只是"无所谓".但这只是它必须的方式吗?HTML的可读性对任何人都无关紧要吗?

我只是想知道这是否曾经让其他任何人足以让他/她为它提出一个"解决方案"(显然它必须是一个将其视为"问题"的人).

html formatting readability indentation

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

是否在using语句未定义的行为中修改值类型?

这个问题真的是这个问题的一个分支,但我认为它应该得到自己的答案.

根据ECMA-334第15.13节(关于using声明,以下称为资源获取):

资源获取中声明的局部变量 是只读的,并且应包括初始化器.如果嵌入语句试图修改这些局部变量(通过赋值或发生编译时间错误++--操作员)或它们传递作为refout 参数.

这似乎解释了为什么下面的代码是非法的.

struct Mutable : IDisposable
{
    public int Field;
    public void SetField(int value) { Field = value; }
    public void Dispose() { }
}

using (var m = new Mutable())
{
    // This results in a compiler error.
    m.Field = 10;
}
Run Code Online (Sandbox Code Playgroud)

但是这个怎么样?

using (var e = new Mutable())
{
    // This is doing exactly the same thing, but …
Run Code Online (Sandbox Code Playgroud)

c# struct specifications using mutable

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

CLR可以支持"函数指针"值类型吗?

几天前,我问为什么委托是引用类型,基于我误导的概念,即委托所需要的只是两个引用:一个是对象,一个是函数.我完全忽略了(不是因为我不知道,仅仅是因为我忘了)是在.NET中,代表至少部分地支持事件作为Observer模式的内置实现,这意味着每个代表通过调用列表支持多个订阅者.

这让我想到,代表们在.NET世界中真正扮演两个不同的角色.一个是简单的函数指针,例如:

Action<string> writeLine = Console.WriteLine;
Run Code Online (Sandbox Code Playgroud)

另一个是可观察到的:

textBox.TextChanged += HandleTextChanged;
Run Code Online (Sandbox Code Playgroud)

调用列表的存在似乎仅适用于第二个角色,就像writeLine上面的简单示例一样,您通常甚至不考虑订阅者.

所以真的,在我看来,可能有两种不同的"种类"代表:"函数指针"类型和"可观察"类型.在我看来,前者可能是一种价值类型.

现在,我并不是说这应该是这种情况,如果可能的话.我确信在常规代理和多播代理之间区分会有很多缺点,例如,如果委托是值类型,可能需要引入新的关键字(multicast?),不可避免的开发人员混淆等我真正想知道简单的是,如果它是可能的,从CLR的角度来看,有可能作为一个函数指针的值类型.

我猜这种问题的另一种方式是:是System.Delegate,它的调用列表和所有,基本上是一个基本的CLR类型; 或者它是一个更简单的"函数引用"类型的包装器,它不会被任何CLR语言暴露?

我为我所使用的所有非正式条款道歉,这些条款可能会使一些受过更多教育的开发人员感到困惑.

.net clr delegates

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

为什么我不能将元素与display右对齐:block和width:X?

总共n00b问题(至少对CSS精英来说):

为什么具有both display: block;和value 的元素width似乎不符合text-align其父元素的属性?也就是说,似乎总是坚持保持向左.

这是一个说明问题的jsFiddle.

显然,这必须与CSS规范一致(我的意思是,如果Chrome,Firefox和Opera都同意它,我毫不怀疑); 我真的不明白.

css layout text-alignment

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

为什么没有Dictionary.TrimExcess()?

在.NET中,有一个构造函数Dictionary<TKey, TValue>需要一个参数,int capacity.这是一样的许多其他收藏品,如List<T>,Queue<T>Stack<T>; 此外,根据MSDN文档:

Dictionary的容量是在需要调整大小之前可以添加到Dictionary的元素数.当元素添加到Dictionary时,通过重新分配内部数组,容量会根据需要自动增加.

这听起来和其他集合一样List<T>,等等.由于这些集合在必要时具有自动调整大小的行为,因此可能具有比所需更大的容量,因此大多数集合都具有一种TrimExcess方法.如果您一次向集合添加未知数量的项目,那么这将非常方便,之后您将不会添加任何其他项目.

为什么没有Dictionary<TKey, TValue>这个相同的TrimExcess方法?

(免责声明:我非常熟悉"默认情况下不存在的功能"的响应;我想我大多只是想知道是否有一个特殊的原因,为什么TrimExcess一个Dictionary没有意义,或为什么它会更加困难到实现比简单的集合,如List.)

.net collections dictionary

10
推荐指数
4
解决办法
2247
查看次数

我在这个谓词链中缺少什么?

注意:在发布这个问题之前,我发现有一个更好的方法来做我想要完成的事情(我觉得它很愚蠢):

IEnumerable<string> checkedItems = ProductTypesList.CheckedItems.Cast<string>();
filter = p => checkedItems.Contains(p.ProductType);
Run Code Online (Sandbox Code Playgroud)

好的,是的,我已经意识到这一点.但是,无论如何,我发布了这个问题,因为我仍然不明白为什么我(愚蠢地)试图做的事情不起作用.


我觉得这很容易.原来它让我很头疼.

基本思路:显示ProductType在a中检查其属性值的所有项目CheckedListBox.

实施:

private Func<Product, bool> GetProductTypeFilter() {
    // if nothing is checked, display nothing
    Func<Product, bool> filter = p => false;

    foreach (string pt in ProductTypesList.CheckedItems.Cast<string>()) {
        Func<Product, bool> prevFilter = filter;
        filter = p => (prevFilter(p) || p.ProductType == pt);
    }

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

但是,如果在ProductTypesList(a CheckedListBox)中检查了"权益"和"ETF"项目.然后由于某种原因,以下代码仅返回"ETF"类型的产品:

var filter = GetProductTypeFilter();
IEnumerable<Product> filteredProducts = allProducts.Where(filter);
Run Code Online (Sandbox Code Playgroud)

我猜想它可能与一些自我引用的混乱有关filter,其本质上是本身 …

.net c# linq delegates predicate

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

Monitor.TryEnter(object)和Monitor.TryEnter(object,ref bool)之间存在什么重要的区别?

似乎这些代码片段的行为应该相同:

1:Monitor.TryEnter(对象)

if (Monitor.TryEnter(lockObject))
{
    try
    {
        DoSomething();
    }
    finally
    {
        Monitor.Exit(lockObject);
    }
}
Run Code Online (Sandbox Code Playgroud)

2:Monitor.TryEnter(object,ref bool) - 在.NET 4.0中引入

bool lockAcquired;
try
{
    Monitor.TryEnter(lockObject, ref lockAcquired);
    if (lockAcquired)
    {
        DoSomething();
    }
}
finally
{
    if (lockAcquired)
    {
        Monitor.Exit(lockObject);
    }
}
Run Code Online (Sandbox Code Playgroud)

我从MSDN文档中看到有关ref bool参数的重载:

如果因为抛出异常而未执行锁定,则在此方法结束后,为lockTaken参数指定的变量为false.这允许程序在所有情况下确定是否有必要释放锁.

但文档指出,仅使用object参数的重载不会引发除例外之外的任何异常ArgumentNullException.因此,它好像如果一个例外是在代码片段抛出1以上,它只能是因为lockObjectIS null,在这种情况下没有作出锁定(并TryEnter会一直返回false)反正,所以Monitor.Exit就没有必要了电话.

很明显,他们不会毫无理由地引入这种过载.那么该Monitor.TryEnter(object, ref bool)方法的目的是什么?

.net multithreading synchronization monitor .net-4.0

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