一个初学者,用txt做数据源实现多用户的登陆注册,强大的泛型集合来完成
一个初学.net的同学才学了泛型和文件流就要做一个winform版的登陆和注册,我就用那狭隘的知识量做了一个登陆注册,来看看吧。
Mylist.txt 作为数据源,放在debug目录下。
先写一个注册页面,把数据写成
这样就可以以用户名,密码的方式保存数据了。
private void btnMyreg_Click(object sender, EventArgs e)
{
if (txtPasswordA.Text.Trim() == TxtPassword.Text.Trim())
{
if (TxtUserName.Text.Length > 0 && txtPasswordA.Text.Length > 0)
{
List<string> list = new List<string>();
list.Add(TxtUserName.Text.Trim());
list.Add(txtPasswordA.Text.Trim());
string[] strs = list.ToArray();
string str = string.Join(",", strs);
//小文件的读取可以用File直接读,大文件一定要用FileStream
string olduser = File.ReadAllText(@"Mylist.txt", Encoding.Default);
//下面是将读出来字符拼接起来再写进去交换行
File.WriteAllText(@"Mylist.txt", olduser + str + "\r\n");
MessageBox.Show("注册成功,系统将转到登陆页面");
FrmLogin frmlogin = new FrmLogin();
this.Hide();
frmlogin.Show();
}
else
{
MessageBox.Show("用户名,密码不能为空");
}
}
else
{
MessageBox.Show("两次输入的密码不一至");
}
}
然后我写了一个登陆页面:
以遍历键值对的方式获取相应的用户名和密码,并做出判断。
private void btnMylogin_Click(object sender, EventArgs e)
{
string[] strs = File.ReadAllLines(@"Mylist.txt", Encoding.Default);
string uname = txtUserName.Text;
string upwd = txtPassword.Text;
Dictionary<string, string> dic = new Dictionary<string, string>();
for (int i = 0; i < strs.Length; i++)
{
//将用户名,密码以键值对的方式存到字典集合中
//dic{[key,value]} dic[key]=value
dic.Add(strs[i].Split(',')[0], strs[i].Split(',')[1]);
}
int a = 0;
foreach (string item in dic.Keys)
{
//遍历集合的key,看是否存在用户名,如果存在,则key==uname,a++是考虑到用户可以有重复存在
if (uname == item)
{
a++;
}
}
if (a > 0)
{
//用户名存在 的时候dic[key]就是对应的密码
if (upwd == dic[uname])
{
MessageBox.Show("登陆成功");
}
else
{
MessageBox.Show("密码不正确");
}
}
else
{
MessageBox.Show("用户名不存在");
}
}
总结:泛型集合很大的提高了程序的性能问题,比如在计算机中经常用到一些数据结构,如队列,链表等,而其中的元素以前一般这么定义:object a=new object();
这样就带来一个严重的问题,用object来表示元素没有逻辑问题,但每次拆箱、封箱就占用了大量的计算机资源,导致程序性能低下,而这部分内容恰恰一般都是程序的核心部分,如果使用object,那么程序的表现就比较糟糕。
而使用泛型则很好的解决这个问题,本质就是在编译阶段就告诉编译器,数据结构中元素的种类,既然编译器知道了元素的种类,自然就避免了拆箱、封箱的操作,从而显著提高c#程序的性能。
比如List<string>就直接使用string对象作为List的元素,而避免使用object对象带来的封箱、拆箱操作,从而提高程序性能。
test