我的应用程序中有相当多的字符串需要在每次从源代码中获取新数据时清除。我想使用类似于string.Empty
的东西,但我不确定如何实现这一点。理想情况下,我也只想这样做一次,而不是每个单独的字符串。
的伪代码:
foreach (string in application)
{
this.empty
}
我是否正在考虑正确的轨道?
我的一些代码如下:
的 classtoinstantiate
public string Str1;
private string str1 {get {return Str1;}}
public void DoStuff()
{
doStuff();
}
private void doStuff()
{
//dostuff
}
Form1.cs
classtoinstantiate class1 = new classtoinstantiate();
class.DoStuff();
//I would like to then clear the *public* iteration of string Str1 here,
//before I DoStuff() again.
答案 0 :(得分:2)
String.Empty
表示非空的空字符串。
如果要清除大量数据(字符串/非字符串),可以将所有变量封装在一个类中,并创建一个Clean()方法,该方法遍历所有变量并清除它们或在需要时实例化该类。在构造函数中设置默认值时的新副本。
class.Empty的使用来自我所理解的有一个明确定义的实例,即空实例。
答案 1 :(得分:2)
鉴于你的评论,我觉得你只想清除字符串,看看这个C#
像伪代码:
public void ClearString(IEnumerable<object> stuffToClear)
{
// go through all the objects to clear
foreach (var item in stuffToClear)
{
// get the properties to clear
var props = from prop in item.GetType().GetProperties()
where prop.PropertyType == typeof(string) // or another type or filter
select prop;
for (var p in props)
{
// clear it
p.SetValue(item, string.Empty);
}
}
}
不是说我是徒手写的,所有的电话肯定都不正确。
答案 2 :(得分:1)
这是基本的OOP概念:在需要时构造对象,最后销毁。构造零件总是处理默认值,这正是您所需要的。
对于托管对象(string
),只需创建一个类的新实例,其中包含必须重置(已清除)的所有数据:
class SomeDataStorage
{
// default is null
public string Data1 {get; set;}
private string _data2 = "default value";
public string Data2 { get {return _data2;} set {_data2 = value;}}
}
然后在需要时构造此对象
foreach (string in application)
{
var data = new SomeDataStorage(); // default values
...
}
当超出范围(离开{ }
或退出功能)时,它将被自动魔法销毁。
对于非托管对象,请实施IDisposable
并考虑经常使用using() { }
进行自动处理。
您可以拥有SomeDataStorage
的应用程序范围的实例。只需指定一个新对象(构造新实例)即可将值重置为默认值。
更清楚地说明:
class App
{
public SomeDataStorage MyData;
public App()
{
Reset();
}
// call this when you need to init for the first time or simply reset to default
public void Reset()
{
MyData = new SomeDataStorage();
}
}
答案 3 :(得分:0)
我建议将所有字符串放入一个类中,并在获得新数据时处置该对象
答案 4 :(得分:0)
public class StringCollection
{
public string StringProp1 { get; set; }
public string StringProp2 { get; set; }
public string StringProp3 { get; set; }
public string StringProp4 { get; set; }
// .... more properties here
// this property won't be touched when clearing
public int SomeOtherProperty{ get; set; }
public void ClearStrings()
{
// returns all public properties
foreach (var prop in this.GetType().GetProperties())
{
// "clear" only properties of type String and those that have a public setter
if (prop.PropertyType == typeof(string) && prop.CanWrite)
prop.SetValue(this, string.Empty, null); // <- "clear" value of the property
}
}
或者,以更一般的方式 - 使用扩展方法:
public class StringCollection
{
public string StringProp1 { get; set; }
public string StringProp2 { get; set; }
public string StringProp3 { get; set; }
public string StringProp4 { get; set; }
public int SomeOtherProperty { get; set; }
}
public class SomeOtherClass
{
public string a1 { get; set; }
public string a2 { get; set; }
public string a3 { get; set; }
public DateTime d1 { get; set; }
public int SomeOtherProperty { get; set; }
}
public static class MyExtensions
{
public static void ClearStrings(this Object obj)
{
// returns all public properties
foreach (var prop in obj.GetType().GetProperties())
{
// "clear" only properties of type String and those that have a public setter
if (prop.PropertyType == typeof(string) && prop.CanWrite)
prop.SetValue(obj, string.Empty, null); // <- "clear" value of the property
}
}
}
使用代码:
StringCollection scol2 = new StringCollection();
// ... do soemthing
scol2.ClearStrings();
SomeOtherClass obj = new SomeOtherClass();
// ... do something
obj.ClearStrings();