小编sve*_*vit的帖子

为什么我的Catch块仅在Visual Studio中进行调试时运行?

Program.cs中的代码

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    try
    {
        Application.Run(new Form1());
    }
    catch (Exception ex)
    {
        MessageBox.Show("Blah...");
    }
}
Run Code Online (Sandbox Code Playgroud)

在Form1中,我有一个带代码的按钮throw new Exception("");.

如果我从Visual Studio运行应用程序,则弹出我的消息框(消息'Blah ...').但是如果我从可执行文件运行应用程序,那么catch块根本不会执行.

为什么不同?

我使用的是Visual Studio 2010,.NET 4.0,Windows XP.

c# exception .net-4.0

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

比较图像以找出差异

任务:我在装配线的末端安装了一个摄像头,可以捕获生产物品的图像.比如说,我们制作门票(上面有一些文字和图片).因此,每张制作的票都被拍照并保存到磁盘上作为图像.现在我想检查这些保存的图像是否有异常(即将它们与图像(模板)进行比较,这是正常的).因此,如果我们的装配线上的票证有问题(缺少图片,污点......),我的应用程序应该找到它(因为它的图像与我的模板差别太大).

问题:比较图片和找出它们之间的差异最简单的方法是什么?我需要编写自己的方法,还是可以使用现有方法?如果我只设置一个公差值(即图像可以相差1%),将两个图像放在一个函数中并获得返回值true或false,那就太好了:)

工具:C#或VB.NET,Emgu.CV(OpenCV的.NET包装器)或类似的东西

.net compare image image-processing

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

Resharper - 生成包括基类成员在内的相等成员

是否有可能为类生成平等成员,该类还包括其基类的成员?

例如 - 抽象基类:

public abstract class MyBaseClass
{
    public int Property1;
}
Run Code Online (Sandbox Code Playgroud)

其他课程:

public class MyOtherClass: MyBaseClass
{
    public int Property2 {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

如果我使用Resharper自动生成相等成员,我只能基于MyOtherClass.Property2属性获得相等,而不是基于Property1其基类.

.net c# resharper equality

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

多态性设计问题

首先抱歉这个问题很长,但我写的不能更短:)

现实世界的例子:我们有大卷纸,上面印有小"贴纸".每个贴纸都有一个代码.代码的前两个字母告诉我们这是什么样的贴纸(代表新卷的贴纸,代表当前卷的末端的贴纸,应该进行质量控制的贴纸,......但是大多数是正常的枚举贴纸) .

例如,代码为XX0001的贴纸意味着,在它之后应该只有正常的枚举代码(如NN0001到NN9999),总是相同的数字.代码QC0001告诉我们,接下来的10个代码(从QC0001到QC0010)应该进行质量控制.

我设计的应用程序,这样,每种类型的标签是它自己的类- ,NormalSticker,,BadSticker ,...他们都从SticerBase类,其中包含了一些常用的数据为所有这些(扫描,日期和时间的质量继承扫描,代码内容).这些类的实例是在静态Parser类中创建的,该类检查代码并将适当的对象返回给我们.ControllStickerQualitySticker

一切正常,但现在我停了下来.我还有一个Roll类,它有一组贴纸,实现为List<StickerBase>.这个类有一个公共AddSticker(StickerBase)方法,我们用它来添加贴纸.但是这个方法应该包含一些逻辑,例如,如果我们得到代码XX001,那么下一个9999贴纸应该是从NN0001到NN9999.我在这里看到的唯一选择是根据贴纸的类型做出决定,例如:

public void AddSticker(StickerBase sticker)
{
    if (sticker.GetType().Equals(typeof(StickerNewRoll)))
    {
        // Next 9999 sticker should be in the form of NN0001 to NN9999
    }

    if (sticker.GetType().Equals(typeof(EnumeratedSticker)))
    {
        // Add 9999 stickers to the list, other business logic...
    }

    if (sticker.GetType().Equals(typeof(QualitySticker)))
    {
        // Stop the machine and notify the worker
    }
}
Run Code Online (Sandbox Code Playgroud)

如果这是正确的方法,我会感到非常惊讶.有任何想法吗?

编辑 - 可能的解决方案:因为对于每个贴纸,我知道下一个贴纸的样子,我可以public Sticker NextStickerShouldLookLike()为每个Sticker类添加新的方法.在验证逻辑中(类似于PéterTörök的回答)我可以检查当前贴纸是否与之相同 …

.net c# oop polymorphism design-patterns

8
推荐指数
2
解决办法
581
查看次数

侦听COM端口时,跨线程操作无效

可能重复:使
跨线程操作无效
跨线程操作无效

我正在尝试侦听COM端口,以便为SerialPort.DataReceived事件创建新的处理程序.逻辑很简单 - 我写了一些东西给TextBox1,按下Button1,我的文本应该在Label1中显示它自己.但我的应用程序不想运行,因为它抛出"交叉线程操作无效"错误.我做了一些搜索并找到了Invoke对象 - 我如何在我的例子中使用它?为什么我需要包含Invoke逻辑?

namespace WindowsApplication1
{
public partial class Form1 : Form
{
    SerialPort sp = new SerialPort();

    public Form1()
    {
        InitializeComponent();
        sp.DataReceived += MyDataReceivedHandler;
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void MyDataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        try
        {
            //sp.PortName = "COM3";
            //sp.Open();
            Label1.Text = sp.ReadLine();
        }
        catch (Exception exception)
        {
            RichTextBox1.Text = exception.Message + "\n\n" + exception.Data;
        }
        finally
        {
            sp.Close();
        }
    }

    private void button1_Click(object sender, EventArgs e)
    { …
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading exception-handling winforms

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

如何使用Enum和其他选项(全部,无)

我有一个枚举,其中:

  • 作为财产包含在我的班级中
  • 它代表数据库表中的一些值(几种类型)
  • 它显示在DropBox中,因此可以用作过滤器

现在我想在此DropBox中添加"All"(或"None")值.

我该怎么做:

  • 将"全部"值添加到枚举?
  • 将"All"值添加到DropBox,将我的属性类型从Enum更改为String
  • 一些其他选择......

.net enums

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

BLL和DAL之间的通信

解决方案设置

  • DAL(班级图书馆)
  • BLL(类库)
  • Common(类库(一些常用功能 - 枚举,日志记录,异常......))
  • Application1(Windows应用程序)
  • Application2(Windows应用程序)
  • WebApp(Web应用程序)
  • ...

假设我有一个Customer实体,它是:

  • SQL Server中的一个表
  • DAL中的CustomerDataTable
  • BLL中的客户类
  • 所有应用程序中的BLL.Customer类

BLL和DAL应该用什么类型的对象进行通信 - DataTable或者List<Customer>(例如)?在第一种情况下,BLL逻辑应将Customer对象转换为DataTable并将其发送到DAL.在secod的情况下,DAL层应该知道Customer层,它位于BLL层中.但原始DLL引用DAL而不是相反......

我是否应该将所有类放入单独的程序集中,这是由所有其他类引用的(Common,BusinessObjects,...)?在这种情况下,我可以在所有项目中使用Customer类.

我知道,当我知道只有一个BLL会使用我的DAL时,我是否应该费心去分离DAL和BLL.在这种情况下,我可以将它们合并为一个项目.

PS - 我正在阅读关于DataTables的内容,很多人说我们根本不应该使用它们.有什么更好的选择?也许现在是我学习一些ORM映射工具的时候了:)

.net c# vb.net data-access-layer bll

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

如何将枚举映射为数据库中的字符串

我的桌子:

create table MyTable (
    Id int identity(1,1) not null,
    MyStatus char(2) not null
)
insert into MyTable(MyStatus) select 'A'
Run Code Online (Sandbox Code Playgroud)

类和枚举:

public class MyTable
{
    public virtual int Id { get; set; }
    public virtual MyTableStatus MyStatus { get; set; }
}

public enum MyTableStatus
{
    A,
    B
}
Run Code Online (Sandbox Code Playgroud)

制图:

public MyTableMap()
{
    Id(x => x.Id);
    Map(x => x.MyStatus);
}
Run Code Online (Sandbox Code Playgroud)

当我执行以下测试时,我得到System.FormatException:输入字符串的格式不正确...

[Test]
public void Blah()
{
    MyTable myTable = Session.Get<MyTable>(1);
    Assert.That(myTable.MyStatus, Is.EqualTo(MyTableStatus.A));
}
Run Code Online (Sandbox Code Playgroud)

将枚举映射到数据库中的字符串表示形式的正确方法是什么?

编辑 - 我在现有数据库上编写应用程序,我无法轻易修改,因为它也被其他应用程序使用.所以数据库中的一些字段(我想在我的应用程序中表示为枚举)是int类型和一些char(2)类型.

string nhibernate enums fluent-nhibernate

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

Oracle触发器 - 变异表的问题

我的桌子:

TableA (id number, state number)
TableB (id number, tableAId number, state number)
TableC (id number, tableBId number, state number)
Run Code Online (Sandbox Code Playgroud)

因此TableC中的项是TableB的子项,TableB中的项是TableA的子项.反之亦然 - TableA中的项是TableB的父项,TableB中的项是TableC的父项.

我想控制父项的状态......比方说,我们有这些数据:

TableA (id, state): 
1, 40

TableB (id, tableAId, state): 
1, 1, 40
2, 1, 60

TableC (id, tableBId, state): 
1, 1, 40
2, 1, 50
3, 2, 60
4, 2, 70
Run Code Online (Sandbox Code Playgroud)

父母国家应该始终保持他孩子最小的状态.所以如果我们现在像这样更新TableC:

update TableC set state = 50 where Id = 1;
Run Code Online (Sandbox Code Playgroud)

我的触发器应该自动更新TableB(设置状态= 50,其中id = 1),然后更新TableA(设置状态= 50,其中id = 1)

我想用触发器(在表A,表B,表C上进行更新,插入,删除之后)执行此操作,以便在执行每个操作后执行以下步骤:

  1. 得到父ID
  2. 从当前父母的所有孩子中找到最小的状态
  3. 如果所有子项的最小状态大于父项的状态,则更新父项

如何避免"改变表错误"?在此示例中是否可以节省使用自治事务?我看到一些意见,变异表错误表明应用程序的逻辑存在缺陷 - 这是真的吗?如何更改我的逻辑以防止此错误? …

oracle triggers ora-04091 mutating-table

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

在序列中查找缺失和重叠的数字

假设我们有这样的数据结构:

var sequences = new List<Tuple<int, int>>
                {
                    new Tuple<int, int>(1, 10),
                    new Tuple<int, int>(8, 101),
                    new Tuple<int, int>(102, 103),
                    new Tuple<int, int>(104, 104),
                    new Tuple<int, int>(110, 200)
                };
Run Code Online (Sandbox Code Playgroud)

我想从这个集合中得到两个结果:

  • 所有缺失的数字(在此示例中:105,106,107,108,109)
  • 所有重叠的数字(在这个例子中:8,9,10)

我可以编写一个带有几个循环和辅助集合的算法.这个过程是可行的,但我想知道这是否可以在LINQ和/或其他更简单和更短的算法的帮助下实现?

编辑:我上面例子的数据结构代表5个序列,第一个包含从1到10的数字,第二个包含从8到101的数字等等...因为在生产中序列可以更大(高达数百万),它们不用实际集合表示(例如带有所有数字的列表),而是用元组表示,它代表每个序列的最小和最大数量.

c# linq range sequence

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