小编Nyr*_*yra的帖子

条件是C#和VB的差异

为什么条件if在VB中不需要处理条件的直接转换.例如在C#中,这很好......

        bool i = false;

        i = (1<2)? true:false;

        int x = i? 5:6;
Run Code Online (Sandbox Code Playgroud)

但如果我想在VB中使用相同的东西,我将不得不施展它

Dim i as Boolean = CBool(IIF(1<2, True, False))
Dim x as Integer = CInt(IIF(i, 5, 6))
Run Code Online (Sandbox Code Playgroud)

我不明白为什么C#会做转换,为什么VB不做.如果我被浇铸在我的C#条件语句如

bool i = Convert.ToBoolean((1<2)? True: False);
int x = Convert.ToInt32(i? 5:6);
Run Code Online (Sandbox Code Playgroud)

另外,是的,我知道IIF返回类型对象,但我会认为C#的确可以返回的不仅仅是True | False; 在我看来,C#处理隐式转换.

c# vb.net

10
推荐指数
2
解决办法
583
查看次数

SerialPort类问题

我试图让串口接收正确的消息时遇到很多问题.它不断截断消息.这是我的代码,我将尝试在代码之后详细说明.

public SerialComms(SerialPort sp)
{
   this.sp = sp;
   this.sp.Open();
   this.sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);

   do
   {
      Console.WriteLine("port open waiting message");
      Console.ReadKey();
   } while(!_terminate);

   this.sp.Close();
}

void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
   string dataReceived;
   StringComparer strComp = StringComparer.OrdinalIgnoreCase;
   SerialPort sp = (SerialPort)sender;
   int i = sp.BytesToRead;
   byte[] _byte = new byte[i];
   char[] _char = new char[i];
   sp.read(_byte, 0, i);
   dataReceived = Encoding.UTF8.GetString(_byte);
   //dataReceived = new string(_char);
   //dataReceived = sp.ReadExisting();

   if (strComp.Equals("00000000000000"), dataReceived))
      _terminate = true;

   Console.WriteLine(dataReceived);
}
Run Code Online (Sandbox Code Playgroud)

现在我有一个测试项目,我们用它来测试生产中使用传统软件的串行com-我知道这样运行正常.我已经将一个串行监视器连接到端口,并且通过传输发送的消息没有任何问题.当我第一次发送消息如012345678901234时,它通常会很好,在接收端,显示器显示它通过; 但是,当它打印到控制台时,它会在第一条消息后被截断.我在端口监视器和控制台输出上附加了消息的屏幕截图(显示的笑脸和心脏是正在转换的前缀字节 - 为什么它是一个心脏和笑脸我不知道)

好的,所以我不能发布图片,因为我没有足够的声誉这样做.我将在下面的控制台中写出输出的内容(在这种情况下由于某种原因它也截断了第一条消息:() …

c# serial-port

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

案例陈述中的RAISERROR

你能否在T-SQL的case语句中引发错误?我总是遇到SQL case语句的问题:/

    begin try
    declare @i int 
    --set @i = (select COUNT(1) from table_name)

    select Item_Num =
        CASE (select COUNT(1) from table_name)
            when 1 then (select Item_Num from table_name)
            when 0 then (raiserror('No records in database', 0, 0))
            ELSE (raiserror('Multiple records in database', 0, 0))
        END
    from table_name

    end try
    begin catch
        declare @errormsg nvarchar(1024),
                @severity int,
                @errorstate int;

        select @errormsg = error_message(),
                @severity = error_severity(),
                @errorstate = error_state();

        raiserror(@errormsg, @severity, @errorstate);
    end catch
Run Code Online (Sandbox Code Playgroud)

t-sql case raiserror

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

代码分析工具

我正在使用Visual Studio的代码分析工具,它给我的一个警告是"不要多次处置对象:对象'conn'可以在方法'CycleMessages.discernScan_Reprint()'中多次处理."以避免生成System.OjectDisposedEx你不应该在一个对象上多次调用Dispose.行:61

    private void discernScan_Reprint()
    {
        try
        {
            DataTable dt = new DataTable();

            SqlConnection conn = new SqlConnection("my constring");
            using (conn)
            {
                SqlCommand cmd = new SqlCommand("usp_myproc", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                using(cmd)
                {
                    cmd.Parameters.Add(new SqlParameter("@param", param));
                    conn.Open();
                    SqlDataReader dr = cmd.ExecuteReader();
                    dt.Load(dr);
                    conn.Close();  // this is line 61
                }
            }

            switch(dt.Rows.Count)
            {
                default:
                    throw new Exception("message");
                case 1:
                    //do Stuff
                case 0:
                    //do stuff
                    break;
            }

        }
        catch (Exception ex) {throw;}
    }
Run Code Online (Sandbox Code Playgroud)

我没有处理conn(显式通过conn.Dispose();),我只是关闭它并允许使用封装来conn对象 - 我知道我可以允许它通过处理关闭,但为什么是它说我要两次处理它?如果有的话它应该警告我说"你不需要终止对将被处置的物体的连接"或类似的东西.我错过了什么吗?

编辑:从关闭的ref链接...

Close方法回滚所有挂起的事务.然后,它会释放与连接池的连接,或者在禁用连接池时关闭连接.

如果SqlConnection超出范围,则不会关闭.因此,您必须通过调用Close或Dispose显式关闭连接.关闭和处置在功能上是等效的.如果连接池值Pooling设置为true或yes,则将基础连接返回到连接池.另一方面,如果Pooling设置为false或no,则关闭与服务器的基础连接.

我知道功能上的Close()与dispose相同,但这不符合我的理解.当我关闭物体时它没有被丢弃.它被关闭或返回到连接池,处理(再次从我的理解)内部调用close()方法 …

c# dispose sqlconnection

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

第一次调用 SelectedIndex 时列表框 SelectedValue 错误

我确实尝试先找到其他答案 - 我发现这个(ListBox 上的项目显示为类名)帖子很相似,但没有准确回答......

无论如何,我有一个列表框,出于某种原因,它将类名填充为所选值,但仅当它第一次加载时(我在调试中进行了单步调试,并在列表获取时调用了已更改的 selectedindex填充。值是正确的,以及显示名称,但它需要对象 ToString()。我不想覆盖 backDatePosting 类中的 ToString() 方法,除非有办法区分这两个字段(即两者都是字符串,我需要它们相应地返回)

backDatePosting 类对象

public class backDatePosting
{
    private readonly string _matnum;
    private readonly string _dtCode;

    public string MatNum
    {
        get
        {
            return _matnum;
        }
    }
    public string DateCode
    {
        get
        {
            return _dtCode;
        }
    }

    public backDatePosting(string _matnum, string _dtCode)
    {
        this._matnum = _matnum;
        this._dtCode = _dtCode;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我的表格

    public Form1()
    { 
      ......
      refreshBackDatePosting();
    }

    void refreshBackDatePosting()
    {
        DataTable dt; 

        System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("sample conn string"); …
Run Code Online (Sandbox Code Playgroud)

c# listbox

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

使用linq替换key处的字典值

编辑:我不觉得这是重复的 - 我没有清楚地说明我想知道一种有效的方法来填充字典值左边的字符.我标记为答案的问题应该澄清,因为它是一个非常不同的答案,而不是其他主题的答案.对不起,我措辞错了.

我试图验证我的词典中的所有值都是一定的长度,如果不是,请在左侧填充"0".我知道"问题是什么",我正在阅读字典的KVP,然后修改它当然会引发异常,但我不知道如何修改我的代码使其"合法"

class prefixMe
{
    Dictionary<string, string> d = new Dictionary<string, string>();

    public prefixMe()
    {
        d.Add("one", "123456");
        d.Add("two", "678");
        d.Add("three", "13");

        foreach(KeyValuePair<string,string> k in d)
        {
            StringBuilder sb = new StringBuilder(k.Value);
            while(sb.Length != 10)
            {
                Console.WriteLine("Key:{0}\tValue:{1}", k.Key, sb);
                sb.Insert(0, '0');
            }
            d[k.Key] = sb.ToString();
            //k.Value.Replace(k.Value, sb.ToString());// = sb.ToString();
            Console.WriteLine("Key:{0}\tNew Value:{1}", k.Key, d[k.Key]);
            break;
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

休息; 停止代码抛出错误,但也使得它不会通过其他值,因为它突破了foreach循环.

结果应该是:

0000123456
0000000678
0000000013
Run Code Online (Sandbox Code Playgroud)

c# dictionary

0
推荐指数
1
解决办法
2715
查看次数