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

C# 在一行C中为公共字节数组赋值#,c#,bytearray,public,C#,Bytearray,Public,我正在使用一个公共字节数组,并希望赋值,就像我在方法中赋值一样,即 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[] 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 };
不会将值分配给现有的
字节[]
:而是用对新的
字节[]
的引用替换引用。如果没有更多的上下文,这种方法可能(也可能不起作用),例如公共
字节[]
可能是只读的,即:

public byte[] Foo { get ; private set ; }
您可以做的是使用
Array.Copy()
的静态重载:

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


请发布一个简短但完整的失败例子。我希望您所提供的一切都是好的,但如果您只是分配给
foo
,而没有声明它,则不会。您的第一个示例已编译(VS2012),您仍然没有显示无法编译的代码。我怀疑您正在尝试
SetSpeed={0x00,0x00,0x00,0x00}
,这与您最初的示例完全不同。此外,您还没有明确说明是真的要创建一个新数组,还是只想对现有数组进行变异。我现在举的例子是无法编译的。@user2340475:Finally。这就是问题的出发点。虽然没有必要这么做,但原始代码还是可以编译的。谢谢你,这很有效,我想我遇到了vague,public标签是相关的,但是被删除了。不用担心,我得到了答案谢谢你对数组的建议。清除,轨迹栏上的下一个勾号确实开始添加大于0的值。@user2340475:但你仍然需要决定是否需要新数组。还有什么东西已经引用了数组吗?它是
array.Clear(SetSpeed,0,4)
((IList)设置速度).Clear()
@JeppeStigNielsen:谢谢,修复了。不,当轨迹栏移离0时,线程开始循环更新内存中的值,该值被设置为SetSpeed,当返回到0时,线程退出,内存中的值被设置为0的4字节
byte[] newBytes = GetSomeBytes() ;
Array.Copy( newBytes , Foo , Foo.Length ) ;
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} ) ;