繁体   English   中英

在一行C#中为一个公共字节数组赋值

[英]Assigning values to a public byte array in one line C#

我正在使用公共字节数组,并希望分配值,就像我在方法中分配数组,即

byte[] foo = {0x32, 0x00, 0x1E, 0x00};

但是当我定义我被迫做的值时

foo[0] = 0x32;
foo[1] = 0x00;
foo[2] = 0x1E;
foo[3] = 0x00;

如果我使用第一个例子VS给出一个错误“只有赋值,调用,递增,递减,等待和新对象表达式可以用作语句”

如果它有帮助,那么数组总是4个字节。

我的代码

public byte[] SetSpeed = new byte[4];
private void trackBar1_Scroll(object sender, EventArgs e)
{
    if (trackBar1.Value == 0)
    {
        try
        {
            stop = true;
            UpdateSThread.Abort();
            Thread.Sleep(350);
        }
        catch { }
        SetSpeed = {0x00,0x00,0x00,0x00};
        WriteMem(GetPlayer() + STATUS_OFFSET, SetSpeed);
        label1.Text = "Normal";              
    }
}

你的第一个例子很好,但它只能在声明中使用 元素必须可隐式转换为元素类型。 大小由给定的元素数量确定。

byte[] foo = { 0x32, 0x00, 0x1E, 0x00 };

或者你也可以这样做

byte[] foo = new byte[4];
foo[0] = 0x32;
foo[1] = 0x00;
foo[2] = 0x1E;
foo[3] = 0x00;

如上所述,您尝试使用的语法只能在声明中使用。 所以试试这样。

public byte[] SetSpeed;
private void trackBar1_Scroll(object sender, EventArgs e)
{
    if (trackBar1.Value == 0)
    {
        try
        {
            stop = true;
            UpdateSThread.Abort();
            Thread.Sleep(350);
        }
        catch { }

        //note it will always create a new array
        SetSpeed = new byte[]{0x00,0x00,0x00,0x00}; 
        WriteMem(GetPlayer() + STATUS_OFFSET, SetSpeed);
        label1.Text = "Normal";              
    }
}

声明变量时,您只能使用未指定new的表单。 所以这很好:

byte[] x = { 1, 2, 3 };

但这不是:

byte[] x;
x = { 1, 2, 3 };

相反,你需要这样的东西:

byte[] x;
x = new byte[] { 1, 2, 3 };

或者,如果类型推断对您有利,并且您使用的是C#3或更高版本,则可以使用隐式类型数组:

string[] x;
x = new[] { "a", "b", "c" };

但是,您确实需要决定是创建新数组,还是要改变现有数组。 鉴于您只是将所有值设置为0,您可以使用:

Array.Clear(SetSpeed, 0, 4);

编辑:现在问题包含这个:

我想更改现有数组中的值,

然后使用

SetSpeed = new byte[] { ... }

恰当的,因为这将改变的值SetSpeed来指代不同的阵列。

要更新现有数组,您可以只使用4个单独的语句,也可以将其提取到具有4个参数的单独方法。 现在还不是很清楚这些值会是什么,这使得很难为您提供最好的代码。

给出的例子

byte[] foo = new byte[] { 0x32, 0x00, 0x1E, 0x00 };

不会将值赋给现有的 byte[] :而是将参考替换为对 byte[]的引用。 如果没有更多上下文,这种方法可能(或可能不起作用),例如public byte[]可能只是readonly,即:

public byte[] Foo { get ; private set ; }

你可以做的是使用Array.Copy()的静态重载:

byte[] newBytes = GetSomeBytes() ;
Array.Copy( newBytes , Foo , Foo.Length ) ;

或者您可以编写一个扩展方法(如果您愿意,可以包装Array.Copy ):

public static CopyFrom<T>( this T[] target , int offset , params T[] source )
{
  foreach ( T value in values )
  {
     // Throws IndexOutOfRangeException if offset exceeds destination length
     target[offset++] = value ; 
  }
}

这将让你做的事情:

public byte[] Foo { get ; private set ; }
.
.
.
Foo.CopyFrom( 0, 1,2,3,4 ) ;
.
.
.
Foo.CopyFrom( 1, new byte[]{1,2} ) ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM