小编com*_*cme的帖子

使用AsSequential以保持顺序

我正在看这段代码

var numbers = Enumerable.Range(0, 20);
var parallelResult = numbers.AsParallel().AsOrdered()
    .Where(i => i % 2 == 0).AsSequential();

foreach (int i in parallelResult.Take(5))
    Console.WriteLine(i);
Run Code Online (Sandbox Code Playgroud)

AsSequential()应该做排序的结果数组.实际上它在执行后被排序,但如果我删除了调用AsSequential(),它仍然被调整(自AsOrdered()).

两者有什么区别?

c# plinq task-parallel-library

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

如何防止工厂方法模式导致构造函数中的虚拟成员调用警告?

www.dofactory.com上,我找到了一个真实的工厂模式示例.但是代码在ReSharper中生成关于构造函数中的虚拟成员调用的警告.

导致警告的代码如下:

abstract class Document
{
    private List<Page> _pages = new List<Page>();

    // Constructor calls abstract Factory method
    public Document()
    {
        this.CreatePages(); // <= this line is causing the warning
    }

    public List<Page> Pages
    {
        get { return _pages; }
    }

    // Factory Method
    public abstract void CreatePages();
}

class Resume : Document
{
    // Factory Method implementation
    public override void CreatePages()
    {
        Pages.Add(new SkillsPage());
        Pages.Add(new EducationPage());
        Pages.Add(new ExperiencePage());
    }
}
Run Code Online (Sandbox Code Playgroud)

在消费代码中,您可以简单地使用:

Document document = new Resume();
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这是一个坏主意,调用构造一个虚拟的成员(如解释 …

c# design-patterns factory-method

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

实现接口隐式和显式是否有意义?

我正在攻读MS 70-515考试.在其中一个实践中,作者实现了隐式和显式的接口.显式实现只调用隐式实现.刚才列出了显式实现而没有解释.

同时拥有接口的隐式和显式实现是否有意义?我认为显式实现是多余的(在这种情况下).

public class PassTextBox : TextBox, IScriptControl
{
    public virtual IEnumerable<ScriptDescriptor> GetScriptDescriptors()
    {
        var descriptor = new ScriptControlDescriptor(
            "AjaxEnabled.PassTextBox", ClientID);
        // ...
        return new ScriptDescriptor[] {descriptor};
    }

    IEnumerable<ScriptDescriptor> IScriptControl.GetScriptDescriptors()
    {
        return GetScriptDescriptors();
    }
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,代码似乎在没有显式实现的情况下运行得很好,因为隐式实现是公开的.

它涉及MCTS Self-Paced Training Kit(考试70-515):使用Microsoft .NET Framework进行Web应用程序开发4第9章,第2课,练习3.

c# explicit interface implicit

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

为什么将ComboBox.SelectedValue设置为null会导致ArgumentNullException?

为什么设置SelectedValueComboBox,以null引起ArgumentNullException

仅当ComboBox实际上是表单的一部分时才会发生异常.我可以设置SelectedValue各种没有意义的值或类型,但我无法设置它null.

SelectedValue不是不可能的null.事实上,它的价值 null在我试图将其设置为时null.

在我的真实代码中,这不会发生在构造函数中,而且我并没有明确地将其设置为null.代码正在使用恰好是的变量null.我可以通过null在尝试设置之前检查变量来修复它SelectedValue.但我不明白的是为什么我不能把它设置为一个null值.

代码编辑:DataSource现在包含ValueMembers值实际的项目null

using System.Collections.Generic;
using System.Windows.Forms;

public class Form1 : Form {
    public Form1() {
        var comboBox1 = new ComboBox();
        Controls.Add(comboBox1);
        comboBox1.ValueMember = "Key";
        comboBox1.DisplayMember = "Value";
        comboBox1.DataSource = new List<Record> {
            new Record {Key = "1", Value = "One"}, 
            new Record …
Run Code Online (Sandbox Code Playgroud)

c# combobox datasource nullreferenceexception winforms

7
推荐指数
2
解决办法
7849
查看次数

为什么具有隐式转换运算符的自定义结构上的Assert.AreEqual失败?

我创建了一个自定义结构来表示金额.它基本上是一个包装器decimal.它有一个隐式转换运算符将其强制转换为decimal.

在我的单元测试中,我断言Amount等于原始十进制值,但测试失败.

[TestMethod]
public void AmountAndDecimal_AreEqual()
{
    Amount amount = 1.5M;

    Assert.AreEqual(1.5M, amount);
}
Run Code Online (Sandbox Code Playgroud)

当我使用int(我没有创建转换运算符)时,测试确实成功.

[TestMethod]
public void AmountAndInt_AreEqual()
{
    Amount amount = 1;

    Assert.AreEqual(1, amount);
}
Run Code Online (Sandbox Code Playgroud)

当我悬停时AreEqual,它显示第一个解析为

public static void AreEqual(object expected, object actual);
Run Code Online (Sandbox Code Playgroud)

而第二个导致

public static void AreEqual<T>(T expected, T actual);
Run Code Online (Sandbox Code Playgroud)

看起来这个int1是隐式地转换为a Amount,而decimal1.5M则不是.

我不明白为什么会这样.我本来希望恰恰相反.第一次单元测试应该能够投射decimalAmount.

当我添加隐式强制转换int(没有意义)时,第二个单元测试也会失败.因此,添加隐式强制转换运算符会破坏单元测试.

我有两个问题:

  1. 这种行为有什么解释?
  2. 如何修复Amount结构,以便两个测试都能成功?

(我知道我可以改变测试来做一个明确的转换,但如果我不是绝对必须,我不会)

我的Amount结构(只是一个显示问题的最小实现)

public struct Amount …
Run Code Online (Sandbox Code Playgroud)

c# struct unit-testing implicit-conversion

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

您调用DoDragDrop方法的控件是否重要?

我想知道我在Windows窗体应用程序中调用DoDragDrop方法的控件是否有任何区别.

我有一个带有两个PictureBox控件的Form.可以拖动一个,另一个将其AllowDrop属性设置为true.

可拖动PictureBox的MouseDown事件处理程序如下:

    private void dragPictureBox_MouseDown(object sender, MouseEventArgs e)
    {
        if (sender is PictureBox)
        {
            var pictureBox = (PictureBox) sender;
            var effect = pictureBox.DoDragDrop(
                pictureBox.Image, DragDropEffects.All);
            MessageBox.Show("Drag ended in a " + effect);
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是我没有在pictureBox上调用DoDragDrop,我似乎可以使用任何控件,例如Form本身

var effect = this.DoDragDrop(pictureBox.Image, DragDropEffects.All);
Run Code Online (Sandbox Code Playgroud)

甚至

var effect = label1.DoDragDrop(pictureBox.Image, DragDropEffects.All);
Run Code Online (Sandbox Code Playgroud)

对我称之为DoDragDrop方法的控件有什么不同?如果是这样,有什么区别?

c# controls drag-and-drop winforms

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

Resharper格式的case语句可以与案例本身在同一行开始吗?

我试图找到一种方法让Resharper格式化这样的switch语句(使用Ctrl + E,Ctrl + C):

switch (int_i) {
    case 1  : Console.WriteLine("You entered one");
              break;
    case 2  : Console.WriteLine("You entered two");
              break;
    case 3  : Console.WriteLine("You entered three");
              break;
    default : Console.WriteLine("Please enter a number between 1 and 5");
              break;
}
Run Code Online (Sandbox Code Playgroud)

我个人根本不喜欢这种风格,但它正在我正在研究的一本书中使用,我希望Resharper帮助我以同样的方式格式化我的代码.

这里有两点需要注意:

  1. 语句必须与case语句在同一行开头.
  2. 冒号必须对齐,因为因为defaultcase 3在冒号之前必须有一个额外的空间更长case 1,case 2并且case 3.

Resharper能做到这一点吗?

c# resharper formatting switch-statement

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

Resharper可以为枚举设置特殊设置吗?

我正在使用Resharper 5.1.1来重新格式化我的代码(清理代码,Ctrl + E,Ctrl + C).我无法按照我想要的方式格式化我的代码.我希望我的代码看起来像这样:

public class Person
{
    public enum Sex {Male, Female}

    public Sex Gender { get; set; }

    public Person(Sex gender)
    {
        Gender = gender;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是enum.由于枚举是一种类型,因为类是一个类型,它们被视为相同.因此,枚举格式为

public enum Sex
{
    Male,
    Female
}
Run Code Online (Sandbox Code Playgroud)

类型的花括号(即enum)放在一个单独的行上,成员也放在一个单独的行上.对于一个正是我想要的类.但对于(简单)enum我只想在一条线上.

对于auto属性,有一个异常(在单行上放置抽象属性/索引器/事件声明),因此auto属性按照我希望的方式进行格式化.

Resharper中是否有一个选项可以将枚举放在一行上?

更新Resharper论坛上发布相同的问题后,我被告知它目前是不可能的.一个功能要求已经为它创建.如果您还认为这是一个您希望在未来版本的Resharper中看到的选项,请投票支持该请求.

c# resharper formatting

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

MenuStrip控件的LayoutStyle可以设置为StackWithOverflow吗?

我用MenuStrip创建一个简单的表单.MenuStrip LayoutStyle设置为HorizontalStackWithOverflow(默认值).

根据MenuStrip上的MSDN参考,其LayoutStyle属性继承自ToolStrip.LayoutStyle的一个可能值HorizontalStackWithOverflow是默认设置.此设置应提供其Overflow属性设置为AsNeeded的项目移动到溢出按钮.

当我运行应用程序并调整窗体大小以使菜单不完全适合时,这不会发生.我已将ToolStripMenuItems溢出属性设置为AsNeeded,但是当我调整窗体大小时,右侧的菜单项就会消失.

文档是否错误,您是否只能在ToolStrip上获得溢出按钮而不是在MenuStrip上?或者,为了让事情有效,我还需要做些什么吗?或者我只是误读了文档?

.net menustrip winforms

5
推荐指数
2
解决办法
3077
查看次数

否定运算符(!)的重载应该是什么类型?

如果我!在一个类中重载操作符,它应该返回什么类型?在一本书中我找到了这个(部分列表):

public class MyType {
    public int IntField { get; set; }

    public MyType(int intField) {
        IntField = intField;
    }

    public static bool operator !(MyType mt) {
        return (mt.IntField <= 0);
}
Run Code Online (Sandbox Code Playgroud)

它确实编译,但我希望!运算符返回一个MyType实例,如

public static MyType operator !(MyType mt) {
    var result = new MyType(-mt.IntField);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

实际上,我希望编译器要求!运算符返回一个MyType.但事实并非如此.

那么......为什么!运算符的返回类型不必是包含类型?你必须做的返回类型++或者--是包含类型.

c# operator-overloading

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