今天主要是主要学习了一些控制台的操作。
主要说说下面的2个方法:
Console.Read();Console.ReadKey()
1. Console.Read(),先看看MSND上的解释
------“在键入输入字符时,Read 方法会阻止其返回;该方法在您按 Enter 键时终止。按 Enter 会在输入内容后面追加一个与平台有关的行终止序列(例如,Windows 追加一个回车符和换行符序列)。对 Read 方法的后续调用一次检索输入中的一个字符。检索完最后一个字符后,Read 会再次阻止其返回,并重复上述循环”
------
大概说了这么个意思 第一次调用会暂停程序,直到输入Enter,同时会在输入内容上添加一个终止序列(Windows下是回车符和换行符)
后续的Read方法调用不会暂停程序,直到Read方法检索完毕了最后一个字符,这时如果要再调用Read方法,程序又会再次处于阻塞状态了,就像第 一次调用Read方法一样,但是这又是新的一次轮回了!
举个简单例子:
Console.Read(); //第一次运行Read()程序停止了 等你输入
Console.WriteLine(Console.Read());//第二次Read()运行没有止
Console.WriteLine(Console.Read());//第三次read()也没有停止
Console.WriteLine(Console.Read());//第四次read()就停止了
假如第一次我输入了字符‘a’并按Enter,那么现在的输入流里面就有字符a 回车符和 换行符。 第二次运行的read()返回结果就是‘a’后面的字符回车符的ascII码(这个类似于sqldataReader类的read()方法,往读取下一条),第三次运行 read()就返回 回车符 后面字符 换行符的 acsII码,此时read()发现已经是最后一个字符了,那么以后的read()方法就会重复上述过程。
我感觉 这个read()方法很麻烦,比如这样的场景可以用console.read():我输入了一堆字符,我想对某些或者某个字符做处理 我就可以用一个
int temp;while((temp=console.read())!=-1){}来遍历 但是要注意强加的那个换行和回车。
2.Console.ReadKey()
这个方法有连个重载Console.ReadKey()和Console.ReadKey(bool);
带bool参数的方法可以隐藏用户的输入,提供个安全保护作用,不多说。
这个方法有两个功能:1.获取用户按下的下一个字符
2.获取用户按下的下一个功能键
第一个大家熟悉,第二个可能就给忽略了。比如我想判读用户是不是输入了回车键
,Shift键,空格键 就可以这样来:
ConsoleKeyInfo cki = Console.ReadKey();
if(cki.Key==ConsoleKey.Enter)
{
//do
}
如果我在把上面的代码放到一个循环里面,一直检测者 如果按了Enter 就执行if()里面的代码。这不是就类似于事件的功能了吗?
还有类对象在内存中是怎么实现的:
在一个程序一开始代码中的类就存在于内存中的托管堆中了。这个过程应该由CLR来完成。在需要该类的一个对象时候 在堆中就new一个内存空间给这个对象,在这个内存空间中存放自己的私人信息,方法、像这些共性的东西还放在类的内存空间中,用到的时候再去拷贝。然后再线程堆栈中存放这个对象的内存引用也就是地址。这样在内存实例化一个对象的过程就结束了。
今天还讲到值类型了引用类型的区别。这个简单些就不说了。今天上台想说下我的看法,紧张的嘴都张不动,也不知道往哪说。以后上台之前一定要想好 我想说什么?要说什么?然后总结下我说的什么。
最后也晒晒我的钢琴程序:写的不好欢迎拍砖
static void Main(string[] args)
{
bool flog1 = false; //判断是不是要重新谈
do
{
Console.WriteLine("按 q 键结束输入...然后播放刚才的曲子....");
bool flog = true;//记录啥时间要停止输入
List<double []> mylist = new List<double []>();//保存按键数
while (flog)
{
DateTime dt = DateTime.Now;
ConsoleKeyInfo cki = Console.ReadKey(true);
int i = 0;
switch (cki.KeyChar)
{
case '1':
Console.BackgroundColor = ConsoleColor.Green;
Console.Write(" ");
i = 37;
break;
case '2':
Console.BackgroundColor = ConsoleColor.Red;
Console.Write(" ");
i = 38;
break;
case '3':
Console.BackgroundColor = ConsoleColor.DarkYellow;
Console.Write(" ");
i = 39;
break;
case '4':
Console.BackgroundColor = ConsoleColor.DarkGreen;
Console.Write(" ");
i = 40;
break;
case '5':
Console.BackgroundColor = ConsoleColor.Blue;
Console.Write(" ");
i = 41;
break;
case '6':
Console.BackgroundColor = ConsoleColor.Magenta;
Console.Write(" ");
i = 42;
break;
case '7':
Console.BackgroundColor = ConsoleColor.DarkMagenta;
Console.Write(" ");
i = 43;
break;
case 'q':
flog = false;
Console.WriteLine();//换行
break;
default:
i = 1000;
Console.BackgroundColor = ConsoleColor.Black;
Console.Write(" ");
break;
}
if(i!=0)//如果没有监测到按键 就不添加记录
{
DateTime dt1 = DateTime.Now;
double dt2 = (dt1 - dt).TotalSeconds;//记录两次按键直接的时间差
Console.Beep(i, 100);
double[] temp = new double[2];
temp[0] = i;
temp[1] = dt2;
mylist.Add(temp);
}
}
//开始播放录音
int tempint = 0;
int tempint2 = 0;
foreach (double [] i in mylist)
{
tempint = (int)(i[1] * 1000);
Thread.Sleep(tempint);
tempint2 =(int)i[0];
Console.WriteLine("音符:{0} 距离上次按键时间差:{1}",i[0],i[1]);
Console.Beep(tempint2, 100);
}
Console.ResetColor();
Console.WriteLine();
Console.WriteLine("播放完毕...");
Console.WriteLine("如果要重新弹曲子,请按 r 键");
if (Console.ReadKey(true).KeyChar == 'r' || Console.ReadKey(true).KeyChar == 'R')
{
flog1 = true;
}
} while (flog1);
}
主要说说下面的2个方法:
Console.Read();Console.ReadKey()
1. Console.Read(),先看看MSND上的解释
------“在键入输入字符时,Read 方法会阻止其返回;该方法在您按 Enter 键时终止。按 Enter 会在输入内容后面追加一个与平台有关的行终止序列(例如,Windows 追加一个回车符和换行符序列)。对 Read 方法的后续调用一次检索输入中的一个字符。检索完最后一个字符后,Read 会再次阻止其返回,并重复上述循环”
------
大概说了这么个意思 第一次调用会暂停程序,直到输入Enter,同时会在输入内容上添加一个终止序列(Windows下是回车符和换行符)
后续的Read方法调用不会暂停程序,直到Read方法检索完毕了最后一个字符,这时如果要再调用Read方法,程序又会再次处于阻塞状态了,就像第 一次调用Read方法一样,但是这又是新的一次轮回了!
举个简单例子:
Console.Read(); //第一次运行Read()程序停止了 等你输入
Console.WriteLine(Console.Read());//第二次Read()运行没有止
Console.WriteLine(Console.Read());//第三次read()也没有停止
Console.WriteLine(Console.Read());//第四次read()就停止了
假如第一次我输入了字符‘a’并按Enter,那么现在的输入流里面就有字符a 回车符和 换行符。 第二次运行的read()返回结果就是‘a’后面的字符回车符的ascII码(这个类似于sqldataReader类的read()方法,往读取下一条),第三次运行 read()就返回 回车符 后面字符 换行符的 acsII码,此时read()发现已经是最后一个字符了,那么以后的read()方法就会重复上述过程。
我感觉 这个read()方法很麻烦,比如这样的场景可以用console.read():我输入了一堆字符,我想对某些或者某个字符做处理 我就可以用一个
int temp;while((temp=console.read())!=-1){}来遍历 但是要注意强加的那个换行和回车。
2.Console.ReadKey()
这个方法有连个重载Console.ReadKey()和Console.ReadKey(bool);
带bool参数的方法可以隐藏用户的输入,提供个安全保护作用,不多说。
这个方法有两个功能:1.获取用户按下的下一个字符
2.获取用户按下的下一个功能键
第一个大家熟悉,第二个可能就给忽略了。比如我想判读用户是不是输入了回车键
,Shift键,空格键 就可以这样来:
ConsoleKeyInfo cki = Console.ReadKey();
if(cki.Key==ConsoleKey.Enter)
{
//do
}
如果我在把上面的代码放到一个循环里面,一直检测者 如果按了Enter 就执行if()里面的代码。这不是就类似于事件的功能了吗?
还有类对象在内存中是怎么实现的:
在一个程序一开始代码中的类就存在于内存中的托管堆中了。这个过程应该由CLR来完成。在需要该类的一个对象时候 在堆中就new一个内存空间给这个对象,在这个内存空间中存放自己的私人信息,方法、像这些共性的东西还放在类的内存空间中,用到的时候再去拷贝。然后再线程堆栈中存放这个对象的内存引用也就是地址。这样在内存实例化一个对象的过程就结束了。
今天还讲到值类型了引用类型的区别。这个简单些就不说了。今天上台想说下我的看法,紧张的嘴都张不动,也不知道往哪说。以后上台之前一定要想好 我想说什么?要说什么?然后总结下我说的什么。
最后也晒晒我的钢琴程序:写的不好欢迎拍砖
static void Main(string[] args)
{
bool flog1 = false; //判断是不是要重新谈
do
{
Console.WriteLine("按 q 键结束输入...然后播放刚才的曲子....");
bool flog = true;//记录啥时间要停止输入
List<double []> mylist = new List<double []>();//保存按键数
while (flog)
{
DateTime dt = DateTime.Now;
ConsoleKeyInfo cki = Console.ReadKey(true);
int i = 0;
switch (cki.KeyChar)
{
case '1':
Console.BackgroundColor = ConsoleColor.Green;
Console.Write(" ");
i = 37;
break;
case '2':
Console.BackgroundColor = ConsoleColor.Red;
Console.Write(" ");
i = 38;
break;
case '3':
Console.BackgroundColor = ConsoleColor.DarkYellow;
Console.Write(" ");
i = 39;
break;
case '4':
Console.BackgroundColor = ConsoleColor.DarkGreen;
Console.Write(" ");
i = 40;
break;
case '5':
Console.BackgroundColor = ConsoleColor.Blue;
Console.Write(" ");
i = 41;
break;
case '6':
Console.BackgroundColor = ConsoleColor.Magenta;
Console.Write(" ");
i = 42;
break;
case '7':
Console.BackgroundColor = ConsoleColor.DarkMagenta;
Console.Write(" ");
i = 43;
break;
case 'q':
flog = false;
Console.WriteLine();//换行
break;
default:
i = 1000;
Console.BackgroundColor = ConsoleColor.Black;
Console.Write(" ");
break;
}
if(i!=0)//如果没有监测到按键 就不添加记录
{
DateTime dt1 = DateTime.Now;
double dt2 = (dt1 - dt).TotalSeconds;//记录两次按键直接的时间差
Console.Beep(i, 100);
double[] temp = new double[2];
temp[0] = i;
temp[1] = dt2;
mylist.Add(temp);
}
}
//开始播放录音
int tempint = 0;
int tempint2 = 0;
foreach (double [] i in mylist)
{
tempint = (int)(i[1] * 1000);
Thread.Sleep(tempint);
tempint2 =(int)i[0];
Console.WriteLine("音符:{0} 距离上次按键时间差:{1}",i[0],i[1]);
Console.Beep(tempint2, 100);
}
Console.ResetColor();
Console.WriteLine();
Console.WriteLine("播放完毕...");
Console.WriteLine("如果要重新弹曲子,请按 r 键");
if (Console.ReadKey(true).KeyChar == 'r' || Console.ReadKey(true).KeyChar == 'R')
{
flog1 = true;
}
} while (flog1);
}
转载于:https://blog.51cto.com/zjj1211/351119