在一行 C# 中为公共字节数组赋值
本文关键字:字节 字节数 赋值 数组 一行 | 更新日期: 2023-09-27 18:28:10
我正在使用一个公共字节数组,并希望分配值,就像我在方法中分配数组一样,即
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 };
或者你也可以 d 这个
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[]
的引用。如果没有更多的上下文,这种方法可能(也可能不起作用(,例如公共byte[]
可能是只读的,即:
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} ) ;