如何确定字符串变量的值是不是在 C# 中更改?

Posted

技术标签:

【中文标题】如何确定字符串变量的值是不是在 C# 中更改?【英文标题】:How do I determine if the value of a string variable changed in C#?如何确定字符串变量的值是否在 C# 中更改? 【发布时间】:2011-08-01 13:07:18 【问题描述】:

仅当特定字符串从其先前的值更改时,我才在按钮单击(将值添加到列表框)下做一些事情。我该如何管理?以下是我的代码示例:

    private void button6_Click(object sender, EventArgs e)
    
        string x = //some varying value I get from other parts of my program
        listBox1.Items.Clear();
        listBox1.Items.Add(x + /*other things*/);   
    

单击按钮 6 时,string x 的值有时与之前的值相同。在这种情况下,我不希望 listBox1 添加项目(字符串 x)。仅当字符串值更改时如何添加到列表框?无法预先确定string x。程序运行时获取值。

注意:每次向 listBox1 添加值,然后删除重复项在我的程序中不起作用。

【问题讨论】:

记住,字符串值永远不会改变。字符串是不可变的。 变量变化。 按钮6?列表框1?帮自己一个忙,给你的表单控件起有意义的名字。未来你会感激的。 @asawyer。是的,当然他们在我的程序中有有意义的名字。在这里发布时没有太大区别。这只是我发布的示例代码。 【参考方案1】:

在页面加载时将当前值添加到 viewstate 并在按钮上单击检查当前值是否等于视图状态中的值。如果两者相等,我们可以说该值没有改变。

protected void Page_Load(object sender, EventArgs e)

if (!IsPostBack)

    ViewState["CurrentValue"] = Your Value;


protected void btnSubmit_click(object sender, EventArgs e)

if (NewValue==  ViewState["CurrentValue"].ToString())

    lblmsg.Text = "value is not changed..";
return;

else
    lblmsg.Text = "value is changed..";

您可以在此链接中查看详细文章。

Check Control Value is changed or not

【讨论】:

好吧,我的 q 在 winforms 上下文中,不过,很好的补充。【参考方案2】:

首先,我想请您检查大多数其他答案。它们更完整,因为它们处理跟踪变量变化的更多全局问题。

现在,我假设,通过阅读您提供的代码的 sn-p,您需要跟踪字符串是否被用户更改因此,换句话说,您可能有一个 TextBox 或其他类型的控件,用户可以通过它更改该值。这是您应该集中注意力的地方:只需使用 TextChanged 事件。

但是,如果我弄错了,并且您的字符串来自任何其他类型的外部源,请使用@Ryan Bennett 建议的包装类,或者,如果您使用的是 .Net 4,请使用动态容器,这会引发任何属性更改时的 PropertyChanged 事件。

【讨论】:

感谢您的介入。不,用户不会更改字符串。它是从数据库中获取的变量。字符串可能相同也可能不同。【参考方案3】:

您是否考虑过在私有字段中保留 old 字符串值的副本,并简单地将新值与旧值进行比较以查看它们是否匹配?

例如:

// holds a copy of the previous value for comparison purposes
private string oldString = string.Empty; 

private void button6_Click(object sender, EventArgs e)

    // Get the new string value
    string newString = //some varying value I get from other parts of my program

    // Compare the old string to the new one
    if (oldString != newString)
    
        // The string values are different, so update the ListBox
        listBox1.Items.Clear();
        listBox1.Items.Add(x + /*other things*/);   
    

    // Save the new value back into the temporary variable
    oldString = newString;

编辑: 正如其他答案所暗示的那样,当然还有其他更复杂的解决方案,例如将对字符串值的所有访问封装在属性中,或者将字符串包装在自定义类中。其中一些替代方案有可能成为“更干净”、更面向对象的方法。但它们都比简单地将先前的值保存在字段中更复杂。由您来决定您的特定用例是需要复杂的解决方案还是更简单的解决方案。考虑长期可维护性,而不是现在更容易实现的东西。

【讨论】:

【参考方案4】:

如果这是 Web 应用程序,请将您的最后一个值存储到会话变量中。如果这是 Windows 应用程序,请将其存储在类级别变量或单例类中,并使用最后一个值与新值进行比较。

【讨论】:

【参考方案5】:

我不确定我是否完全理解,但听起来您应该使用属性来设置 String x;

string _x = string.Empty;
public string X

   set
   
      if(value != this._x)
      
         DoFancyListBoxWork();
         this._x = value;
      
   

   get
   
      return this._x;
   

【讨论】:

选项是为 DoFancyListBoxWork() 使用事件;【参考方案6】:

如果这个字符串非常重要并且经常被传递,也许你应该将它包装在一个类中。该类可以将字符串值作为属性保存,还可以跟踪它的更改时间。

public class StringValue

   private bool _changed;
   public string StrValueget; set _changed = true;
   public bool Changedget;set;

这当然是初级的

【讨论】:

这是个好主意。思维方式有利于我【参考方案7】:
string last = string.Empty;
private void button6_Click(object sender, EventArgs e)
    
        string x = //some varying value I get from other parts of my program
        if(x!=last)
        
            listBox1.Items.Clear();
            listBox1.Items.Add(x + /*other things*/);
            last = x;
        
    

【讨论】:

以上是关于如何确定字符串变量的值是不是在 C# 中更改?的主要内容,如果未能解决你的问题,请参考以下文章

C#中的“定义字符串变量”是啥意思。

如何访问和更改在 FLUTTER/DART 的另一个类中声明的字符串变量的值

C#:如何查找两个字符串数组是不是包含相同的值

如何在每次加载页面时更改 php 变量的值? [复制]

如何检查字符串是不是包含列表的任何元素并获取元素的值?

通过 C# 确定字符串是不是是有效的文件路径