C#调用其他类方法时如何实现int类型序号每次调用自动加1
核心问题分析
- 实例创建位置错误:你在每次按钮点击事件里都新建
Something实例,每个实例的非静态sequenceNumber字段初始值都是0,自然每次调用都不会累积自增结果。 - 语法错误:
I_FRAME方法中IFrame[0] = (byte)((sequenceNumber);多了半个左括号,缺少右括号匹配IFrame[1] = 0x00行末尾缺少分号- 自增逻辑运算优先级错误:
%优先级高于+,原代码sequenceNumber + 1 % 32768等价于sequenceNumber + 1,模运算完全没有生效,需要加括号调整优先级 - 方法名大小写不匹配:类内定义的方法名为
I_FRAME,调用时写的是I_Frame,会触发编译错误
- 需求匹配问题:你需要多个
Something对象共享同一个自增序号的话,sequenceNumber字段需要设置为静态成员,保证所有类实例共用同一个计数变量。 - 赋值类型错误:
testbyte[0]是byte类型,直接赋值给Text属性会输出数值的原始字符串,若需要16进制显示需要额外转换。
注意:
sequenceNumber计数到超过255时,强转byte会发生高位截断,只会保留低8位的值,如果你需要完整传输16位的序号,需要将sequenceNumber拆分高低位分别赋值给IFrame[0]和IFrame[1]。
修正方案
情况1:单个Something实例独立计数
把Something实例提到窗体类的全局作用域,不要每次点击都新建:
public class Something { private int sequenceNumber; public int SequenceNumber { get { return sequenceNumber; } set { sequenceNumber = value; } } public int I_FRAME(ref byte[] IFrame) { // 修正语法错误 IFrame[0] = (byte)sequenceNumber; IFrame[1] = 0x00; // 修正运算优先级,模32768保证序号在0~32767循环 sequenceNumber = (sequenceNumber + 1) % 32768; return sequenceNumber; } }
public partial class VlastniTCP : Form { byte[] testbyte = new byte[2]; // 将Something实例提到全局作用域,每次点击复用同一个实例 private Something test = new Something(); private void button2_Click(object sender, EventArgs e) { test.I_FRAME(ref testbyte); // 若需要显示16进制可以用testbyte[0].ToString("X2") textBox1.Text = testbyte[0].ToString(); } }
情况2:多个Something实例共享同一个自增序号
将sequenceNumber改为静态成员,所有实例共用同一个计数:
public class Something { // 设为静态成员,所有类实例共用同一个计数 private static int sequenceNumber; public int SequenceNumber { get { return sequenceNumber; } set { sequenceNumber = value; } } public int I_FRAME(ref byte[] IFrame) { IFrame[0] = (byte)sequenceNumber; IFrame[1] = 0x00; sequenceNumber = (sequenceNumber + 1) % 32768; return sequenceNumber; } }
这种情况下即使你每次点击都新建Something实例,序号也会持续自增。
内容的提问来源于stack exchange,提问作者Petr Vytlačil
相关产品推荐
相关产品推荐

