• 一、打开vs2015 文件-新建-项目-选择Windows窗体应用程序 二、工具箱目录 通用 form类 control 类 messagebox 类 button 类 label 类 textbox 类 richtextbox 类 listbox类 ... chec...

    一、打开vs2015

           文件-新建-项目-选择Windows窗体应用程序

    二、工具箱目录

    1. 通用
    2. form类
    3. control 类
    4. messagebox 类
    5.  button 类
    6.  label 类
    7.  textbox 类
    8.  richtextbox 类
    9.  listbox类
    10.  checklistbox 类
    11.  combobox 类
    12.  radiobox 类
    13.  checkbox 类
    14.  tabcontrol 类
    15. picturebox 类
    16.  panel 类
    17.  menustrip 类
    18. toolstripmenuitem 类
    19. toolstrip 类
    20. toolstripbutton 类
    21. statusstrip类
    22. timer 类
    23. progressbar 类
    24. openfiledialog 类


     

     

    ●·● 通用:

    1. 按Ctrl键同时拉动控件,可以复制一个控件。

    2. 在Form上点右键》查看代码,或是按F7。F4显示属性。

    3. 实现文件夹打开显示功能,类似右键》打开所在文件夹。
      System.Diagnostics命名空间:
        Process类:提供对本地和远程进程的访问并使您能够启动和停止本地系统进程。

    复制代码

    1. 用Explorer.exe打开文件夹:
      System.Diagnostics.Process.Start("Explorer.exe",@"D:\DOCUMENTS\"); 
      System.Diagnostics.Process.Start("Explorer.exe",@"D:\DOCUMENTS"); 
    
    2. 用notepad.exe打开记事本:
      System.Diagnostics.Process.Start("notepad.exe",@"F:\Desktop\1.txt"); 
    
    3. 用Word的快捷方式打开Word文件:
      System.Diagnostics.Process.Start(@"F:\Desktop\Word 2010", @"F:\Desktop\1.docx");
    
    4. 用Firefox打开网址:www.baidu.com:
      System.Diagnostics.Process.Start(@"C:\Program Files (x86)\Mozilla Firefox\firefox.exe", "www.baidu.com");
    

    复制代码

    4. 建立事件模板,然后调用:由于事件的监视及管理是由Application对象进行的,程序员不需要知道用户何时响应事件或者是响应了什么事件,只需要为事件添加响应方法即可。添加方法”+=“,取消方法”-=“。参数sender为事件发出者;e为事件的附加数据,事件不同,e也不同。

    复制代码

            public Form1()
            {
                InitializeComponent();
                textBox2.MouseMove += new MouseEventHandler(textBox_MouseMove);     //调用事先建立的模板
                textBox3.MouseMove += new MouseEventHandler(textBox_MouseMove);     //四个TextBox可以实现相同的功能
                textBox4.MouseMove += new MouseEventHandler(textBox_MouseMove);     //通过双击Tab键可以自动实现后半部分
                textBox5.MouseMove += new MouseEventHandler(textBox_MouseMove);
            } 
            private void textBox_MouseMove(object sender, MouseEventArgs e)     //建立事件模板
            {
                TextBox tb = sender as TextBox;
                tb.BackColor = Color.Red;
            }

    复制代码

    View Code - TextBox_KeyPress 只允许数字输入

    5. 用代码在Form中写控件,同时可以编写控件数组,例如:

    复制代码

                Label[] lbs = new Label[5];     //建立标签控件数组
                for (int i = 0; i < lbs.Length; i++)
                {
                    lbs[i] = new Label();       //在声明下Label类
                    this.Controls.Add(lbs[i]);      //将Label加到控件集中
                    lbs[i].Left = 14;
                    lbs[i].Top = 30 * i + 14;       //设置控件的位置
                    lbs[i].Width = 400;         //设置控件的宽度
                }

    复制代码

            首先用Label建立数组,接下来遍历数组,给数组的每个要素声明Label,接下来用Controls的Add方法将用代码写的控件添加到控件集中,同时设置控件的位置和长宽。

    6. 用代码执行事件:首先是双击控件,生成一个button1_Click(object sender,EventArgs e)的函数,通过代码直接调用这个函数,既可以调用这个事件,说到底就是调用函数。

    复制代码

            private void button1_Click(object sender, EventArgs e)
            {
                axWindowsMediaPlayer1.URL = musicPath + @"music\1.mp3";
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                button1_Click(button1, e);    //通过代码调用按钮单击事件,其他事件调用是类似的!
            }       

    复制代码

    ---------------------------------------------------------------------------------------------------------

     

    ●·● Form 类

    1. Form 属性:

    • TopMost:获取或设置一个值,指示该窗体是否应显示为最顶层窗体。
    • OwnedForms:获取 Form 对象的数组,这些对象表示此窗体拥有的所有窗体。(先要用AddOwnedForm()方法来添加窗体。)

      View Code - 实现跨窗体关闭窗体

    • AcceptButton:获取或设置当用户按 Enter 键时所单击的窗体上的按钮。
    • CancelButton:获取或设置当用户按 Esc 键时单击的按钮控件。
    • MaximizeBox:获取或设置一个值,该值指示是否在窗体的标题栏中显示“最小化”按钮。(bool)
    • MinimizeBox:获取或设置一个值,该值指示是否在窗体的标题栏中显示“最大化”按钮。(bool)
    • MaximumSize:获取窗体可调整到的最大大小。
    • MinimumSize:获取窗体可调整到的最小大小。
    • ClientSize:获取或设置窗体工作区的大小。窗体工作区的大小是除边框和标题栏外窗体的大小。窗体的工作区是窗体内可放置控件的区域。
    • Size:获取或设置窗体的大小。包括外边框!ClientSize要比Size表示的范围小一点。
      • Width:
      • Height:
    • Opacity:获取或设置窗体的不透明度级别。默认值是1,为不透明,0为完全看不见。
    • IsMdiContainer:获取或设置一个值,该值指示窗体是否为多文档界面 (MDI) 子窗体的容器。(bool)
    • MdiParent:获取或设置此窗体的当前多文档界面 (MDI) 父窗体。(子窗体显示在父窗体内部)
    • MdiChildren:获取窗体的数组,这些窗体表示以此窗体作为父级的多文档界面 (MDI) 子窗体。
      • Length:获取子窗体的个数。
    • ActiveMdiChild:获取当前活动的多文档界面 (MDI) 子窗口。
    • BackgroundImage:获取或设置在控件中显示的背景图像。 
      • Size:获取图片的大小。
    • FormBorderStyle:获取或设置窗体的边框样式。
      • None:无边框。
      • FixedSingle:固定的单行边框。
      • Fixed3D:固定的三维边框。
      • FixedDialog:固定的对话框样式的粗边框。
      • Sizable:可调整大小的边框。
      • FixedToolWIndow:
      • SizableToolWindow:
    • WindowState:获取或设置窗体的窗口状态。
      • Normal,Minimized,Maximized
    • KeyPreview:获取或设置一个值,该值指示在将键事件传递到具有焦点的控件前,窗体是否将接收此键事件。 如果窗体将接收所有键事件,则为 true;如果窗体上当前选定控件接收键事件,则为 false。默认为 false

    2. Form 方法:

    • Activate:激活窗体并给予它焦点。
    • AddOwnedForm:向此窗体添加附属窗体。
    • Close:关闭窗体。
    • LayoutMdi:在 MDI 父窗体内排列多文档界面 (MDI) 子窗体。MdiLayout 枚举
      • Cascade:所有 MDI 子窗口均层叠在 MDI 父窗体的工作区内。
      • TileHorizontal:所有 MDI 子窗口均水平平铺在 MDI 父窗体的工作区内。
      • TileVertical:所有 MDI 子窗口均垂直平铺在 MDI 父窗体的工作区内。
      • ArrangeIcons:所有 MDI 子图标均排列在 MDI 父窗体的工作区内。
    • Hide:对用户隐藏控件。
    • Show:显示窗体。两个窗体都可以操作!
    • ShowDialog:将窗体显示为模式对话框。只能操作对话框窗体!
        通过在 Load 事件中修改 Location 可以改变显示的位置!
    • Focus:用于激活窗体并给予其焦点。
    • SetBounds(int x, int y, int width, int height):x和y为窗体位置坐标,width为窗体宽度,height为窗体高度。
    • SetDesktopLocation(int x, int y):以桌面坐标设置窗体的位置。
    • SetDesktopBounds(int x, int y, int width, int height):以桌面坐标设置窗体的边界。

    3. Form 事件:

    • Load:第一次显示窗体前发生。
    • Move:窗体移动的时候触发。
    • Activated:窗体获得焦点(被激活)时引发。
    • Deactivate:窗体失去焦点(未激活)时引发。
    • FormClosing:在关闭窗体时发生。
      其中 e 有两个重要的属性!
        Cancel:获取或设置指示是否应取消事件的值。true 则取消关闭动作!
        CloseReason:获取一个值,该值指示关闭窗体的原因。

      复制代码

              private void Form1_FormClosing(object sender, FormClosingEventArgs e)
              {  
                  DialogResult a;
                  a = MessageBox.Show("你真的要关闭吗(⊙_⊙?)", "警告", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                  if (a == DialogResult.No)       //DialogResult枚举的值, 根据上面MessageBox中的按钮来定
                  {
                      e.Cancel = true;       //单击No, 取消关闭.
                  }
              }

      复制代码

    • FormClosed:关闭窗体后发生。
    • KeyUp:在控件有焦点的情况下释放键时发生。
    • KeyDown:在控件有焦点的情况下按下键时发生。
    • KeyPress:在控件有焦点的情况下按下键时发生。
      ※ 可以通过新建一个空的textbox,然后用下面语句来吸走焦点!
      textBox1.Focus();
      ※ 参考:解决:无法引发Form.KeyUp或Form.KeyDown事件 

    4. Form扩展:

    • 添加的窗体Form2,还是一个类,因此不能直接用,还要先new一个才能用,类似下面的例子,要想加载Form2,首先要new一个Form2,然后在用Show方法。

      1             Form2 form2 = new Form2();
      2             form2.Show();
    • 在Form2中调用Form1中的TextBox文本实现,直接调用不能实现,需要在Form1中建立一个新的属性,然后让这个属性返回TextBox的文本。
      Form1代码:

      复制代码

              private static string bt1;       //定义字段
              public string BT1       //定义属性获取textBox1的text值
              {
                  get
                  {
                      return bt1;       //返回字段的值
                  }
              }
              public void button1_Click(object sender, EventArgs e)
              {
                  bt1 = textBox1.Text.Trim();       //给字段赋值
              }

      复制代码

      Form2代码:
             Form1 frm1 = new Form1();        //先实例化一个Form1
             frm1.Show();
             MessageBox.Show(frm1.BT1);        //调用frm1的public属性BT1
    • 通过Form2关闭Form1的方法,如Form属性中OwnedForms的举例。 

    5. 窗体间的交互:

    实现图示:

    单独点击红色按钮时候,显示下面的帮助文件!

    再次点击红色按钮时,帮助文本框关闭,同时用帮助文本框自带的“×”也可以关闭窗体!

    实现代码:

    主窗体部分:

    复制代码

    Form2 fr2;  //定义帮助窗体
    
    public static bool IsHelpClosed = true; //定义全局的static变量,是否手动关闭窗体
    
    private void button4_Click(object sender, EventArgs e)
    {
       
        if (!IsHelpClosed)  //若没有手动关闭窗体,则此时关闭窗体
        {
            fr2.Close();
        }
        else                //若手动关闭了窗体,此时要打开窗体
        {
            fr2 = new Form2();
            fr2.Show();
            fr2.Left = this.Left + this.Width + 10;
            fr2.Top = this.Top;
        }
    }

    复制代码

    帮助窗体部分:

    复制代码

    private void Form2_Load(object sender, EventArgs e)
    {
        Form1.IsHelpClosed = false;  //窗体加载的时候,给其赋值为未手动关闭
    }
    
    private void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        Form1.IsHelpClosed = true;  //窗体手动关闭时候,给其赋值为手动关闭
    }

    复制代码

    ※ 参考: C# WinForm 窗体之间传递参数问题总结

     

    6. 实现不同窗体中的控制

    如上面例子,在我打开帮助文本框的时候,按钮显示“关闭帮助”;当我关闭帮助文本框的时候,按钮显示“帮助”。问题在于关闭帮助文本框的时候,如何能操作到主窗体的帮助按钮修改为“帮助”呢,这就要要在床架 Form2 的时候后,定义关闭窗体事件!

    复制代码

    private void button3_Click(object sender, EventArgs e)
    {
        if (!IsHelpClosed)
        {
            help.Close();
            button3.Text = "帮助";
        }
        else
        {
            help = new Helper01();
            help.FormClosed += new System.Windows.Forms.FormClosedEventHandler(helpChange);  //写事件
            help.Show();
            help.Left = Left + Width + 10;
            help.Top = Top + Height / 2 - help.Height / 2;
            button3.Text = "关闭帮助";
        }
    }
    
    private void helpChange(object sender, FormClosedEventArgs e)  //事件函数,保证与委托的参数一致
    {
        button3.Text = "帮助";
    }

    复制代码

     

    ●·● Control 类

    1. 定义控件的基类,控件是带有可视化表示形式的组件。

    2. Control 属性:

    • Anchor:获取或设置控件绑定到的容器的边缘并确定控件如何随其父级一起调整大小。Top, Left, Bottom, Right -- 若选中Top,则保持与Top的距离不变。
    • Dock:获取或设置哪些控件边框停靠到其父控件并确定控件如何随其父级一起调整大小。None, Top, Left, Bottom, Right, Fill -- 适合容器控件。
    • → 获取或设置哪些控件边框停靠到其父控件并确定控件如何随其父级一起调整大小。Anchor 和 Dock 属性是互相排斥的。 每次只可以设置一个属性,最后设置的属性优先。
    • Cursor:获取或设置当鼠标指针位于控件上时显示的光标。
    • Controls:获取包含在控件内的控件的集合。 
    • Enabled:获取或设置一个值,该值指示控件是否可以对用户交互作出响应。 
    • Font:获取或设置控件显示的文字的字体。 
      • Font类
      • Font(Font, FontStyle) 构造函数:字体,字体样式
      • Font(FontFamily, Single) 构造函数:字体名称,字体大小
        • FontFamily ff = richtextbox.SelectionFont.FontFamily   将RichTextBox中选中文本的FontFamily复制给ff,然后可以将ff用在其他Font构造函数中。
        • View Code - 实现字体大小改变

      • Font(FontFamily, Single, FontStyle)构造函数:字体名称,字体大小,字体样式
    • ForeColor:获取或设置控件的前景色。
    • Padding:获取或设置控件内的空白。
      • All,Left,Right,Top,Bottom 
    • Size:获取或设置控件的高度和宽度。 
      • Height,Width
    • TabIndex:获取或设置在控件的容器的控件的 Tab 键顺序。 
    • TabStop:获取或设置一个值,该值指示用户能否使用 Tab 键将焦点放到该控件上。 (bool)
    • Top:顶
    • Left:左
    • Right:右
    • Bottom:底
    • Height:高度
    • Width:宽度
    • Text:文本
    • Visible:获取或设置一个值,该值指示是否显示该控件及其所有父控件。 
    • Tag:获取或设置包含有关控件的数据的对象,Tag可以赋予任何类型的值,例如可以赋予bool类型的值,可以用来记录一个控件是否得到了想要的结果,若是得到了就赋值为true,否则赋值为false,就是一种标签和记录。

    3. Control 方法:

    • Focus:为控件设置输入焦点。
    • PointToScreen(Point p):将指定工作区点的位置计算成屏幕坐标。就是将控件左上角的点转换为屏幕坐标,而参数 p 是一个参考点,一般应为 Point.Empty 这样就可以确切的转为屏幕点了,否则会有偏差的!
      pTag.left = button1.PointToScreen(System.Drawing.Point.Empty).X;  //按钮左的横坐标
      pTag.bottom = button1.PointToScreen(System.Drawing.Point.Empty).Y + button1.Height;  //按钮下的纵坐标
    • PointToClient:将指定屏幕点的位置计算成工作区坐标。
    • FindForm:检索控件所在的窗体。

    4. Control 事件

    • Click:单击
    • DoubleClick:双击
    •  
    • KeyDown:当控件有焦点时,按下一个键时引发该事件,这个事件总是在KeyPress和KeyUp之前引发。
    • KeyPress:当控件有焦点时,按下一个键时发生该事件,这个事件总是在KeyDown之后、KeyUp之前引发。KeyDown 和 KeyPress的区别是KeyDown传送被按下的键的键盘码,而KeyPress传送被按下的键的char值。
    • KeyUp:当控件有焦点时,释放一个键时发生该事件,这个事件总是在KeyDown和KeyPress之后引发。
    •  
    • MouseClick:单击,释放鼠标触发(左键)
    • MouseDown:按下即触发(左右键)
    • MouseMove:在鼠标滑过控件时触发
    • MouseUp:释放鼠标触发(左右键)

    ---------------------------------------------------------------------------------------------------------

     

    ●·● MessageBox 类

    1. 显示可包含文本、按钮和符号(通知并指示用户)的消息框。

    2. MessageBox 方法:

    • Show(String):显示具有指定文本的消息框。
    • Show(String, String):显示具有指定文本和标题的消息框。
    • Show(String, String, MessageBoxButtons):
      显示具有指定文本、标题和按钮的消息框。
    • Show(String, String, MessageBoxButtons, MessageBoxIcon):
      在指定对象的前面显示具有指定文本、标题、按钮和图标的消息框。
      • MessageBoxIcon 枚举
      • None,Hand,Question,Exclamation,Asterisk,Stop,Error,Warning,Information
    • Show(String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton):
      显示具有指定文本、标题、按钮、图标和默认按钮的消息框。
    • Show(String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton, MessageBoxOptions):
      显示具有指定文本、标题、按钮、图标、默认按钮和选项的消息框。
    • 参考:http://zyq5510806.blog.163.com/blog/static/122738986200911185925316/
    • Show方法的返回值为DialogResult枚举,因此可以通过根据返回的DialogResult枚举值,来获取用户的按键!!!上面的FormClosing事件有演示这个方法。
       

    ---------------------------------------------------------------------------------------------------------

     

    ●·● Button 类

    1. Button 属性:

    • FlatStyle:按钮的样式。
    • FlatAppearance:获取用于指示选中状态和鼠标状态的边框外观和颜色。
          BorderColor:获取或设置按钮周围的边框的颜色。
          BorderSize:获取或设置一个值,该值指定按钮周围的边框的大小(以像素为单位)。
          MouseDownBackColor:获取或设置在控件边框内按下鼠标时按钮工作区的颜色。
          MouseOverBackColor:获取或设置当鼠标指针位于控件边框内时按钮工作区的颜色。

      【制作自定义按钮】=> 通过FlatStyle中选择Flat,FlatAppearance中选择BorderColor、MouseDownBackColor、MouseOverBackColor为背景颜色,BorderSize为0。通过改变图片的颜色或是增加对比度、减少亮度,来实现按钮的效果。
       
    • Image:获取或设置显示在按钮控件上的图像。
      • 使用 Image 类赋值
        • FromFile(String):从指定的文件创建Image:"F:\Desktop\1.jpg"。(s)
    • ImageAlign:获取或设置按钮控件上的图像对其方式。

    2. Button 方法:

    • PerformClick:生成按钮的 Click 事件。

    3. Button 事件:

    • MouseDown:当鼠标指针位于控件上并按下鼠标键时发生。
    • MouseUp:在鼠标指针在控件上并释放鼠标键时发生。
    • GotFocus:在控件接收焦点时发生。
    • LostFocus:当控件失去焦点时发生。
      参考:http://www.docin.com/p-222459647.html

    ---------------------------------------------------------------------------------------------------------

     

    ●·● Label 类

    1. Label 属性:

    • Left:标签控件距离左边的像素。
    • Top:标签控件距离顶边的像素。
    • Height:标签控件的高度。
    • Width:标签控件的宽度,对于代码写的标签控件,要将Width设置大点,否则有些内容不会显示出来。

      View Code - 标签数组

    • BorderStyle:指定标签边框的样式。
    • FlatStyle:
    • LinkArea:(只用于LinkLabel)文本中显示为链接的部分。
      • Start:
      • Length:
    • LinkColor:(只用于LinkLabel)链接的颜色。
    • VisitedLinkColor:(只用于LinkLabel)用户单击LinkLabel后控件的颜色。
    • TextAlign:获取或设置标签中文本的对齐方式。(ContentAlignment枚举)

    ●·● TextBox 类

    1. TextBox 属性:

    • CharacterCasing:这个值表示TextBox是否会改变输入的文本大小写
      • Lower,Normal,Upper
    • PasswordChar:设置密码。
    • Modifier:修饰语。
      • Public,Protected,Protected Internal,Internal,Private(默认)
    • MaxLength:指定输入文本的最大字符长度。
    • Multiline:多行显示。(bool)
    • ReadOnly:表示文本是否为只读。
    • WordWrap:指示多行文本框控件在必要时是否自动换行到下一行的开始。
    • SelectedText:在文本框中选择的文本。
    • SelectionLength:选择的字符数。
    • SelectionStart:被选中文本的开头。
    • ScrollBars:获取或设置哪些滚动条应出现在多行 TextBox 控件中。None, Vertical, Horizontal, Both
    • Lines:获取或设置文本框控件中的文本行。textBox1.Lines = new string[] { "abcd", "efg", "hijklmn" };

    2. TextBox 事件:

    • TextChange:当Text内容发生变化的时候发生。
    • KeyPress:
      • KeyPressEventArgs 类 
      • private void textBoxAge_KeyPress(object sender, KeyPressEventArgs e)
      • (属性)KeyChar:获取或设置与按下的键对应的字符。
        • 8→退格  13→回车  48→0  65→A  97→a   
      • (属性)Handled:true,删除KeyPress的值,false则打印出KeyPress的值。
      • 复制代码

              private void textBoxSize_KeyPress(object sender, KeyPressEventArgs e)
              {
                 // Remove all characters that are not numbers, backspace, or enter.
                 if ((e.KeyChar < 48 || e.KeyChar > 57) &&
                                                        e.KeyChar != 8 && e.KeyChar != 13)
                 {
                    e.Handled = true;
                 }
                 else if (e.KeyChar == 13)
                 {
                    // Apply size if the user hits enter
                    TextBox txt = (TextBox)sender;
        
                    if (txt.Text.Length > 0)
                       ApplyTextSize(txt.Text);
                    e.Handled = true;
                    this.richTextBoxText.Focus();
                 }
              }

        复制代码

    • Enter:接触时候出发
    • Leave:离开时候出发
    • Validating:CausesValidation属性设置为true时才会有机会触发
    • Validated:
    • → 这4个事件按照列出的顺序引发。它们统称为“焦点事件”,当控件的焦点发生改变时引发,但有两个例外。Validating 和 Validated仅在控件接收了焦点,且其CausesValidation属性设置为true时引发。接收焦点的控件引发事件的原因是有时即使焦点改变了,我们也不希望验证控件的有效性。它的一个示例是用户单击了Help按钮。
    • → private void textBoxOccupation_Validating(object sender, CancelEventArgs e)
    • → 其中sender就是通过TextBox显式转换的textBoxOccupation,可以这样定义:TextBox tb = (TextBox)sender;
    • → 然后可以像用textBoxOccupation一样的用tb。其他几个用法相似。
    • → 参考:http://blog.sina.com.cn/s/blog_6116673a0100fpeo.html
    • → 可以通过建立一个通用的Validating事件,然后通过调用,来实现其他窗口的Validating事件,实现代码的重用。

      View Code - 建立事件调用事件

      • SystemColors 类:每个属性都是Color结构,这种结构是Windows显示元素的颜色。(静态类)
        • Window:窗口工作区中背景的颜色。
      • Colors 结构:表示一种 ARGB 颜色(alpha、红色、绿色、蓝色)。
        • Red,Blue,Green。。。

    ---------------------------------------------------------------------------------------------------------

     

    ●·● RichTextBox 类

    1. 表示 Windows 多格式文本框控件。

    2. RichTextBox 属性:

    • SelectionFont:获取或设置当前选定文本或插入点的字体。
    • SelectionColor:获取或设置当前选定文本或插入点的文本颜色。
    • SelectionAlignment:获取或设置应用到当前选定内容或插入点的对齐方式。
      • HorizontalAlignment 枚举
    •  

    3. RichTextBox 方法:

    • Focus:为控件设置输入焦点。
    • LoadFile:将文件的内容加载到RichTextBox控件中。例:richTextBox1.LoadFile(@"F:\Desktop\1.rtf");
      richTextBox1.LoadFile(@".\Example.rtf");    直接存在“.\bin\Debug”文件夹中了
    • 复制代码

              private void button1_Click(object sender, EventArgs e)
              {
                  OpenFileDialog dia = new OpenFileDialog();
                  dia.InitialDirectory = @"F:\Desktop";
                  dia.Filter = "RTR(*.rtf)|*.rtf";
                  if (dia.ShowDialog() == DialogResult.OK)
                  {
                      richTextBox1.LoadFile(dia.FileName);
                  }
              }

      复制代码

    • SaveFile:将RichTextBox的内容保存到文件。
    • 复制代码

              private void button3_Click(object sender, EventArgs e)
              {
                  SaveFileDialog dia = new SaveFileDialog();      //定义保存对话框
                  dia.Filter = "RTF|*.rtf|WORD|*.doc";        //文件格式过滤
                  if (dia.ShowDialog() == DialogResult.OK)        //选择OK键执行
                  {
                      richTextBox1.SaveFile(dia.FileName);        //存储缩写文件名的文件
                  }
              }

      复制代码

    •  

    4. RichTextBox 事件:

    • LinkClicked:点击网址链接时候执行的动作。
    •         private void richTextBox1_LinkClicked(object sender, LinkClickedEventArgs e)
              {
                  System.Diagnostics.Process.Start(e.LinkText);       //跳转到指定网址
                  System.Diagnostics.Process.Start("www.baidu.com");      //自定义网址
                  MessageBox.Show(e.LinkText);        //输出link的字符串
              }
    •  

    ●·● ListBox 类

    1. 表示允许单项或多项选择的类表框控件。

    2. ListBox 属性

    • Items:获取类表控件项的集合。
      • Add:
      • AddRange:
      • Clear:
      • Count:
      • Contains:
      • IndexOf:
      • Insert:
      • Remove:
      • RemoveAt:
    • MultiColumn:多列显示,水平滚动条,否则垂直滚动条。
    • SelectedIndex:这个值表示列表框中选中项的基于0的索引。如果列表框可以一次选择多个选项,这个属性就包含选中列表中的第一个选项。
    • SelectedItem:在只能选择一个选项的列表框中,这个属性包含选中的选项。在可以选择多个选项的列表框中,这个属性包含选中项中的第一项。
    • SelectedItems:获取类表控件项被选中项的集合。
    • SelectionMode:选择模式,None,One,MultiSimple,MultiExtended。
    • Sort:true排序。

    3. ListBox 方法:

    • ClearSelected:清除列表框中的所有选项。
    • <int> FindString(string s):查找列表框中第一个以指定字符串开头的字符串,例如FindString("a")就是查找列表框中第一个以a开头的字符串。
    • <int> FindString(string s, int startIndex):给定起始索引。
    • FindStringExact():与FindString类似,但必须匹配整个字符串。
    • <int> GetSelected(int index):返回一个表示是否选择一个选项的值。
    • SetSelected(int index, bool value):存在且为true,则选中。
    • ToString:返回当前选中的选型。

    4. ListBox 事件:

    • SelectedIndexChanged:在选中选项的索引改变时引发事件。

    View Code - 遍历ListBox选中的项

    View Code - 同上

    --------------------------------------------------------------------------------------------------------- 

     

    ●·● CheckedListBox 类

    1. 显示一个 ListBox,其中在每项的左边显示一个复选框。

    2. CheckedListBox 属性:

    • CheckOnClick:true时,点击即选中,false,要点两下才选中。
    • CheckedIndices:选中索引的集合,int集合。
    • CheckedItems:选中项的集合,string集合。

    3. CheckedListBox 方法:

    • <bool> GetItemChecked(int index):返回指示指定项是否选中的值。
    • <CheckState> GetItemCheckState(int index):返回指示指定项是否选中的值。(checked,unchecked,Indeterminate)
    • SetItemChecked(int index, bool check):指定项是否选中。
    • SetItemCheckState(int index, CheckState):指定项选中,三种状态。

    View Code - CheckedListBox举例

    --------------------------------------------------------------------------------------------------------- 

     

    ●·● ComboBox 类

    1. ComboBox 属性:

    • SelectedIndex:获取或设置指定当前选定项的索引。
    • SelectedItem:获取或设置ComboBox中当前选定的项。
    • MaxDropDownItems:获取或设置要在ComboBox的下拉部分中显示的最大项数。
    • Items:获取一个对象,该对象表示该ComboBox中所包含项的集合。
      • Add:添加一个Item。
      • AddRange:添加一个string类型数组。
      • Clear:清除所有Item。
      • Contains(object value):判断集合中是否存在写入的对象,返回bool。

    --------------------------------------------------------------------------------------------------------- 

     

    ●·● RadioButton 类

    1. 当与其他 RadioButton 控件成对出现时,使用户能够从一组选项中选择一个选项。(放在Panel控件里面)

    2. RadioButton 属性:

    • Appearance:样式
    • AutoCheck:true,用户单击单选按钮时,会显示一个选中记号,false,要在Click事件中写入。
    • Checked:是否被选中。(bool)

    3. RadioButton 事件:

    • CheckChanged:当RadioButton地选中选项发生改变时,引发这个事件。
    • Click:每次单击RadioButton时,都会引发该事件。

    View Code - 显示选中按钮的内容

    复制代码

            private void button1_Click(object sender, EventArgs e)
            {
                foreach (RadioButton c in groupBox1.Controls)   //遍历盒子中的所有RadioButton控件
                {
                    if (c.Checked)      //若是被选中,则输出选中控件的Name
                        MessageBox.Show(c.Name);
                }
            }

    复制代码

    --------------------------------------------------------------------------------------------------------- 

     

    ●·● CheckBox 类

    1. 表示用户可以选择和清除的控件。多选按钮。

    2. CheckBox 属性:

    • Checked:是否被选中。
    • CheckState:三种状态,Checked,Indeterminate,Unchecked
    • ThreeState:这个属性为false时,用户就不能把CheckState属性改为Indeterminate。可以在代码中改。

    View Code - 遍历Form中的CheckBox

    View Code - 遍历Panel中的CheckBox

    复制代码

            private void button2_Click(object sender, EventArgs e)
            {
                StringBuilder sb = new StringBuilder();      //建立一个StringBuilder,方便Append
                foreach (CheckBox c in groupBox2.Controls)        //遍历盒子中的CheckBox
                {
                    if (c.Checked)
                    {
                        sb.AppendLine(c.Name);        //如果选中,则附加Name
                    }
                }
                MessageBox.Show(sb.ToString());        //ToString输出
            }

    复制代码

    3. CheckBox 事件:

    • CheckedChanged:当复选框的Checked属性发生改变时,就引发该事件。
    • CheckedStateChanged:当CheckedState属性改变时,引发该事件。

    --------------------------------------------------------------------------------------------------------- 

     

    ●·● TabControl 类

    1. 管理相关的选项卡页集。

    2. TabControl 属性:

    • Alignment:获取或设置选项卡在其中对齐的控件区域(例如,顶部边缘)。【显示tab的位置】
    • <TabPage> SelectedTab:获取或设置当前选定的选项卡页。
    • TabCount:获取选项卡条中选项卡的数目。
    • TabIndex:获取或设置在控件的容器的控件的 Tab 键顺序。
    • TabPages:获取该选项卡控件中选项卡页的集合。
    • SelectedIndex:获取或设置当前选定的选项卡页的索引。
    • SelectedTab:获取或设置当前选定的选项卡页。

    3. TabControl 方法:

    • DeselectTab(int index):使指定的选项卡后面的选项卡成为当前选项卡。
              private void button1_Click(object sender, EventArgs e)
              {
                  int a;
                  a = tabControl1.SelectedTab.TabIndex;
                  label1.Text = a.ToString();
                  tabControl1.DeselectTab(a);
              }
    • SelectTab(int index): 使指定的选项卡成为当前选项卡。
      SelectTab(string tabpagename):名称
      SelectTab(TabPage tabpage):TabPage

    --------------------------------------------------------------------------------------------------------- 

     

    ●·● PictureBox 类

    1. 表示用于显示图像的 Windows 图片框控件。

    2. PictureBox 属性:

    • SizeMode:改变显示图片的方式,存在一个PictureBoxSizeMode枚举。
      AutoSize,CenterImage,Normal,StretchImage(变形),Zoom(缩小)。
    • BorderStyle:指示控件的边框样式。
    • BackColor:获取或设置控件的背景色。指定为透明色。
      pbox.BackColor = Color.Transparent;
    • Image:获取或设置由 PictureBox 显示的图像。
    • ErrorImage:获取或设置在图像加载过程中发生错误时,或者图像加载取消时要显示的图像。
    • ImageLocation:获取或设置要在 PictureBox 中显示的图像的路径或 URL。
    • InitialImage:获取或设置在加载主图像时显示在 PictureBox 控件中的图像。
    • Location:获取或设置该控件的左上角相对于其容器的左上角的坐标。
    • Size:获取或设置控件的高度和宽度。
      代码:pbox.Size = new System.Drawing.Size(20, 18); 
    • SizeMode:指示如何显示图像。
      StretchImage(完全填充)、AutoSize(正常大小显示)、CenterImage(显示图像的中心部分)、Zoom(缩小或放大完全显示)

    3. PictureBox 方法:

    • Load(String):通过路径调用图片。

    4. PictureBox 事件:

    • MouseClick:在鼠标单击该控件时发生。
      参数中含有MouseEventArgs e,e可以获取X,Y的值!
      代码:Point myPT = new Point(e.X, e.Y);
    • Click:不具有上面的功能。

    ※ Properties\Resources.resx可以存储图片资源文件,也可以直接调用。如右图所示:

    View Code - 添加桃花

    --------------------------------------------------------------------------------------------------------- 

     

    ●·● Panel 类

    1. 为所有Panel元素提供基类。为RadioButton和CheckBox等提供一个独立的面板。

    2. Panel 属性:

    • Controls:Panel里面的控件集合。

    相关窗体控件:

    • GroupBox类:表示一个 Windows 控件,该控件显示围绕一组具有可选标题的控件的框架。

    --------------------------------------------------------------------------------------------------------- 

     

    ●·● MenuStrip 类

    1. 提供窗体的菜单系统。

    • &(F)    以F作为快捷键,可以修改任意字母,会自动生成“ (F) ”的样子。主菜单要同时按下Alt键。&File→File
    • 一个“ - ”表示一个分割线。
    • 菜单名称+“ ... ”表示还有个窗体。

    --------------------------------------------------------------------------------------------------------- 

     

    ●·● ToolStripMenuItem 类

    1. 表示 MenuStrip 或 ContextMenuStrip 上显示的可选选项。

    2. ToolStripMenuItem 属性:

    • ShortcutKeys:获取或设置与 ToolStripMenuItem 关联的快捷键。
      newToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.Z;
          //组合按键
      newToolStripMenuItem.ShortcutKeys = newToolStripMenuItem.ShortcutKeys & ~Keys.Shift;
          //减少按键
    • ShowShortcutKeys:是否将快捷键显示在子菜单中。
    • CheckOnClick:是否显示选中的√。
    • Checked:获取或设置一个值,该值指示是否选中 ToolStripMenuItem。(bool)
    • Enabled:获取或设置一个值,该值指示是否已启用控件。(bool)
    • Visible:获取或设置一个值,该值指示是否显示该项。(bool)

    ---------------------------------------------------------------------------------------------------------

     

    ●·● ToolStrip 类

    1. 为 Windows 工具栏对象提供容器。

    2. ToolStrip 属性:

    • GripStyle:柄是否在工具栏的最左侧显示。
    • LayoutStyle:控制工具栏上的项如何显示。
    • Items:包含工具栏中所有项的集合。
    • ShowItemToolTip:允许确定是否显示工具栏上某项的工具提示。

    在ToolStrip中可以使用许多控件:http://book.51cto.com/art/200901/105510.htm

    ---------------------------------------------------------------------------------------------------------

     

    ●·● ToolStripButton 类

    1. 表示包含文本和图像的可选的 ToolStripItem。

    2. ToolStripButton 属性:

    • ToolTipText:获取或设置作为控件的 ToolTip 显示的文本。默认与Text一至。

    ---------------------------------------------------------------------------------------------------------

     

    ●·● StatusStrip 类

    1. 表示 Windows 状态栏控件。

    2. 可以直接建立下面四个控件:

    ---------------------------------------------------------------------------------------------------------

     

    ●·● Timer 类

    1. 实现按用户定义的时间间隔引发事件的计时器。此计时器最宜用于 Windows 窗体应用程序中,并且必须在窗口中使用。

    2. Timer 属性:

    • Enabled:获取或设置计时器是否正在运行。(默认是False)
    • Interval:获取或设置在相对于上一次发生的 Tick 事件引发 Tick 事件之前的时间(以毫秒为单位)。

    3. Timer 方法:

    • Start:启动计时器。
    • Stop:停止计时器。

    4. Timer 事件:

    • Tick:当指定的计时器间隔已过去而且计时器处于启用状态时发生。

    ---------------------------------------------------------------------------------------------------------

     

    ●·● ProgressBar 类

    1. 表示 Windows 进度栏控件。

    2. ProgressBar 属性:

    • Maximum:获取或设置控件范围的最大值。
    • Minimum:获取或设置控件范围的最小值。
    • Value:获取或设置进度栏的当前位置。10 → 10%
    • Step:获取或设置调用 PerformStep 方法增加进度栏的当前位置时所根据的数量。
    • MarqueeAnimationSpeed:获取或设置进度块在进度栏内滚动所用的时间段,以毫秒为单位。
    • Style:获取或设置在进度栏上指示进度应使用的方式。

      复制代码

                  //通过设置ProgressBar的最大值,然后没执行一句话,value增加1,即达到了目的!
                  using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True"))
                  {
                      conn.Open();
                      int lines;
                      using (SqlCommand cmd = conn.CreateCommand())
                      {
                          cmd.CommandText = "select count(*) from city";
                          lines = Convert.ToInt32(cmd.ExecuteScalar());
                      }
                      progressBar1.Maximum = lines;
                      using (SqlCommand cmd = conn.CreateCommand())
                      {
                          cmd.CommandText = "select * from city";
                          using (SqlDataReader reader = cmd.ExecuteReader())
                          {
                              while (reader.Read())
                              {
                                  using (StreamWriter streamWriter = File.AppendText(ofd.FileName))
                                  {
                                      streamWriter.WriteLine(reader.GetInt32(0).ToString() + "|" + reader.GetString(1) + "|" + reader.GetInt32(2).ToString());
                                      progressBar1.Value++;
                                  }
                              }
                          }
                      }
                  }

      复制代码


       

    3. Progress 方法:

    • Increment:按指定的数量增加进度栏的当前位置。
    • PerformStep:按照 Step 属性的数量增加进度栏的当前位置。

    ---------------------------------------------------------------------------------------------------------

     

    ●·● OpenFileDialog 类

    1. 提示用户打开文件。

    2. OpenFileDialog 属性:

    • FileName:获取或设置一个包含在文件对话框中选定的文件名的字符串。
    • FileNames:获取对话框中所有选定文件的文件名。
    • Filter:获取或设置当前文件名筛选器字符串,该字符串决定对话框的“另存为文件类型”或“文件类型”框中出现的选择内容。
      举例:dia.Filter = "程序|*.exe|Word|*.docx|Pic|*.jpg" ---- 分成三部分,索引为1,2,3。
      要是写不止一个的扩展名,则用“;”隔开即可,英文格式的,
      例如:"Bmp File(*.bmp;*.jpg;*.png)|*.bmp;*.jpg;*.png"。
    • FilterIndex:获取或设置文件对话框中当前选定筛选器的索引。同Filter相关联
    • InitialDirectory:获取或设置文件对话框显示的初始目录。例:dia.InitialDirectory = @"F:\Desktop";
    • Multiselect:获取或设置一个值,该值指示对话框是否允许选择多个文件。

    3. OpenFileDialog 方法:

    • ShowDialog:显示对话框,同时返回值,对应对话框中的按钮。
      • DialogResult 枚举
      •             if (dia.ShowDialog() == DialogResult.OK)      //单击OK触发
                    {
                        richTextBox1.LoadFile(dia.FileName);      //将点击文件的内容加载进来
                    }

    ---------------------------------------------------------------------------------------------------------

     

    ●·● SaveFileDialog 类

    1. 提示用户选择文件的保存位置。无法继承此类。

    2. SaveFileDialog 属性:

    • AddExtension:获取或设置一个值,该值指示如果用户省略扩展名,对话框是否自动在文件名中添加扩展名。
    • DefaultExt:获取或设置默认文件扩展名。 
    • FileName:获取或设置一个包含在文件对话框中选定的文件名的字符串。【全路径】
    • Filter:获取或设置当前文件名筛选器字符串,该字符串决定对话框的“另存为文件类型”或“文件类型”框中出现的选择内容。
    • InitialDirectory:获取或设置文件对话框显示的初始目录。
    • RestoreDirectory:获取或设置一个值,该值指示对话框在关闭前是否还原当前目录。
    • Title:获取或设置文件对话框标题。

    3. SaveFileDialog 方法:

    • ShowDialog:

    ColorDialog 类:

    FontDialog 类:

     

    展开全文
  • c#的语法变量运算符类型转换判断语句循环语句 变量 变量类型 int double char string decimal(金钱类型) 命名规范 1.需要有意义 2.以字母开头,后面跟任意的字母、数字或者下划线,不能有特殊符号 3.Camel:要求变量...

    变量

    变量类型
    int double char string decimal(金钱类型) bool
    命名规范
    1.需要有意义
    2.以字母开头,后面跟任意的字母、数字或者下划线,不能有特殊符号
    3.Camel:要求变量名中首单词的首字母小写,其余每个单词的首字母都要大写,多用于给变量命名
    4.Pascal:要求标示符中每个单词的首字母都要大写,其余小写,多用于给类或者方法命名

    运算符

    +号:1.相加 2.连接
    算数运算符:+ - * / %
    ++:前++与后++的区别
    –:前–与后–的区别

    类型转换

    自动类型转换(隐士类型转换):int—double
    显示类型转换(强制类型转换):double—int
    Convert:类型不兼容不可以转换 int i=convert.(需要转换类型);
    int.parse()
    int.Tryparse() 效率最高

    判断语句

    if用于判断区间值情况
    if 判断单种情况
    if-else 判断两种情况
    if-else-if 判断多种情况
    if(判断条件)
    {
    (要执行的代码);
    }
    else
    {
    (要执行的代码);
    }

    switch-case用于判断等值情况
    switch(变量或者表达式的值)
    {
    case 值1:要执行的代码;
    break;
    case 值2:要执行的代码;
    break;
    case 值3:要执行的代码;
    break;

    default:要执行的代码;
    break;
    }

    循环语句

    while循环
    while(循环条件)
    {
    循环体;
    }
    特点:先判断,再执行,有可能一遍循环都不执行

    do-while循环
    do
    {
    循环体;
    }while(循环条件);
    特点:先循环,再判断,最少执行一遍循环体。

    for循环
    for(表达式1;表达式2;表达式3)
    {
    循环体;
    }
    表达式1一般为声明循环变量,记录循环的次数(int i=0;)
    表达式2一般为循环条件(i<10)
    表达式3一般为改变循环条件的代码,使循环条件终有一天不再成立(i++)。
    执行过程:程序首先执行表达式1,声明了一个循环变量用来记录循环的次数,
    然后执行表达式2,判断循环条件是否成立,如果表达式2返回的结果为true,
    则执行循环体。当执行完循环体后,执行表达式3,然后执行表达式2继续判断循环条件是否成立,
    如果成立则继续执行循环体,如果不成立,则跳出for循环。

    展开全文
  • C#自学(3)

    2019-07-24 10:56:34
    文章目录C#的继承object类继承base关键字virtualabstractsealed构造器多态接口接口的实现接口实现多态 C#的继承 不像C++那样可以灵活的使用单重和多重继承,C#仅支持单重继承,中所有类都是从 Object 类继承而来的,...

    C#的继承

    不像C++那样可以灵活的使用单重和多重继承,C#仅支持单重继承,中所有类都是从 Object 类继承而来的,Object 类中的属性和方法可以被用到任何类。
    而若要使用多重继承则是通过接口来解决这一问题。

    object类

    object类是C#中所有类的根源,无论是系统预设的datetime类、math类,还是用户自己定义的类,都是由object类继承而来,这就意味着所有类都可以使用obj类中所含的方法和属性

    obj类常用的方法

    常用方法 描述
    Equals 判断两个对象是否相等
    GetHashCode 获取哈希码
    GetType
    ToString

    Equals方法用于两个对象是否相等,包括引用对象,若相等为True

    Equals (object ol, object o2); //静态方法
    Equals (object o); //非静态方法
    

    GetHashCode 方法返回当前 System.Object 的哈希代码,每个对象的哈希值都是固定的。
    该方法不含有任何参数,并且不是静态方法,因此需要使用实例来调用该方法

    Console.WriteLine(obj1.GetHashCode());
    

    GetType方法用于获取对象type类型,返回值为 System.Type 类型。

    class Program
    {
        static void Main(string[] args)
        {
            int i = 100;
            string str = "abc";
            Student stu = new Student();
            Console.WriteLine(i.GetType());
            Console.WriteLine(str.GetType());
            Console.WriteLine(stu.GetType());
        }
    }
    

    运行结果
    ToString方法用于返回对象实例的字符串

    继承

    C#使用的继承方式:
    可能是由于只有单重继承的原因吧,所以父类前面不用加修饰符

    访问修饰符  class  ClassA:ClassB
    {
        //类成员
    }
    

    这区分于C++使用的继承

    class ClassA:继承修饰符 Class B
    {
    	//类成员
    }
    

    base关键字

    base.func();
    

    调用父类成员函数。

    virtual

    和C++中的virtual概念很类似,可以理解为重写父类中的属性和方法时使用

     //修饰属性
    public  virtual  数据类型  属性名{get; set; }
    
    //修饰方法
    访问修饰符  virtual  返回值类型方法名
    {
        语句块;
    }
    

    子类在重写时加上修饰override

    public override void Print()
    {
        base.Print ();
        Console.WriteLine("专业:"+ Major);
        Console.WriteLine("年级:"+ Grade);
    }
    

    abstract

    abstract 关键字代表的是抽象的,使用该关键字能修饰类和方法,修饰的方法被称为抽象方法、修饰的类被称为抽象类。类似C++的虚基类,同样不能进行实例化

     访问修饰符  abstract  方法返回值类型  方法名(参数列表);
    

    抽象方法定义后面的“;”符号是必须保留的。需要注意的是,抽象方法必须定义在抽象类中

    在定义抽象类时,若使用 abstract 修饰类,将其放到 class 关键字的前面,语法形式如下。

    访问修饰符  abstract class  类名
    {
        //类成员
    }
    

    sealed

    声明密封类或密封方法,使用该关键字能修饰类或者类中的方法,修饰的类被称为密封类、修饰的方法被称为密封方法

    密封方法必须出现在子类中,并且是子类重写的父类方法,即 sealed 关键字必须与 override 关键字一起使用

    密封类不能被继承,密封方法不能被重写

    构造器

    和C++的构造函数类似,继承关系也几乎相同

    在子类中若想调用父类构造器的话加 :base() 即可

    多态

    多态称为运行时多态,也就是在程序运行时自动让父类的实例调用子类中重写的 方法,它并不是在程序编译阶段完成的

    实现多态必须满足:

    • 子类在继承父类时必须有重写的父类的方法。
    • 在调用重写的方法时,必须创建父类的对象指向子类(即子类转换成父类)

    接口

    接口就是用于实现像C++中的多重继承
    interface关键字定义接口

    interface  接口名称
    {
        接口成员;
    }
    
    1. 接口名称
      通常是以 I 开头,再加上其他的单词构成。例如创建一个计算的接口,可以命名为 ICompute。
    2. 接口成员
      接口中定义的成员与类中定义的成员类似。

    接口中定义的成员必须满足以下要求。

    • 接口中的成员不允许使用 public、private、protected、internal 访问修饰符。
    • 接口中的成员不允许使用static、virtual、abstract、sealed 修饰符。
    • 在接口中不能定义字段。
    • 在接口中定义的方法不能包含方法体。
    interface ICompute
    {
        int Id { get; set; }
        string Name { get; set; }
        void Total();
        void Avg();
    }
    

    由于接口中的方法并没有具体的内容,直接调用接口中的方法没有任何意义

    在 C# 语言中规定不能直接创建接口的实例,只能通过类实现接口中的方法

    接口的实现

    在类中实现一个接口时必须将接口中的所有成员都实现,否则该类必须声明为抽象类,并将接口中未实现的成员以抽象方式实现

    class  类名 : 接口名
    {
        //类中的成员以及实现接口中的成员
    }
    

    隐式实现:

    class ComputerMajor : ICompute
    {
        public int Id { get; set; }     //隐式的实现接口中的属性
        public string Name { get; set; }    //隐式实现接口中的属性
        public double English { get; set; }
        public double Programming { get; set; }
        public double Database { get; set; }
        public void Avg()       //隐式实现接口中的方法
        {
            double avg = (English + Programming + Database) / 3;
            Console.WriteLine("平均分:" + avg);
        }
        public void Total()
        {
            double sum = English + Programming + Database;
            Console.WriteLine("总分为:" + sum);
        }
    }
    

    显示实现:

    class ComputerMajor : ICompute
    {
        public double English { get; set; }
        public double Programming { get; set; }
        public double Database { get; set; }
        int ICompute.Id { get; set; }           //显示实现接口中的属性
        string ICompute.Name { get; set; }      //显示实现接口中的属性
        void ICompute.Total()                   //显示实现接口中的方法
        {
            double sum = English + Programming + Database;
            Console.WriteLine("总分数:" + sum);
        }
        void ICompute.Avg()
        {
            double avg = (English + Programming + Database) / 3;
            Console.WriteLine("平均分为:" + avg);
        }
    }
    

    在使用显式方式实现接口中的成员时,所有成员都会加上接口名称 ICompute 作为前缀,并且不加任何修饰符

    接口实现多态

    条件

    • 定义接口并使用类实现了接口中的成员。
    • 创建接口的实例指向不同的实现类对象。
    interface IShape//接口Ishape
    {
        double Area { get; }
        double X { get; set; }
        double Y { get; set; }
        string Color { get; set; }
        void Draw();
    }
    class Rectangle :IShape
    {
        //为矩形的长和宽赋值
        public Rectangle(double length,double width)
        {
            this.Length = length;
            this.Width = width;
        }
        public double Length { get; set; }//定义长方形的长度
        public double Width { get; set; }//定义长方形的宽度
        public double Area
        {
            get
            {
                return Length * Width;//计算长方形面积
            }
        }
        public string Color { get; set; }
        public double X { get; set; }
        public double Y { get; set; }
        public void Draw()
        {
            Console.WriteLine("绘制图形如下:");
            Console.WriteLine("在坐标 {0},{1} 的位置绘制面积为 {2} 颜色为 {3} 的矩形", X, Y, Area, Color);
        }
    }
    class Circle : IShape
    {
        //为圆的半径赋值
        public Circle(double radius)
        {
            this.Radius = radius;
        }
        public double Radius { get; set; }
        public double Area
        {
            get
            {
                return Radius * Radius * 3.14;
            }
        }
        public string Color { get; set; }
        public double X { get; set; }
        public double Y { get; set; }
        public void Draw()
        {
            Console.WriteLine("绘制图形如下:");
            Console.WriteLine("在坐标为 {0},{1} 的位置绘制面积为 {2} 颜色为 {3} 的圆形", X, Y, Area, Color);
        }
    }
    
    主程序:
    
        class Program
        {
            static void Main(string[] args)
            {
                IShape shape1 = new Rectangle(10, 20);
                shape1.X = 100;
                shape1.Y = 200;
                shape1.Color = "红色";
                shape1.Draw();
                IShape shape2 = new Circle(10);
                shape2.X = 300;
                shape2.Y = 500;
                shape2.Color = "蓝色";
                shape2.Draw();
            }
        }
    
    
    
    
    

    结果

    展开全文
  • 正如一切自学那样,走弯路是常态,找对路是运气。显然,那一百个小时,我并没有找对路。 我以为,书籍分为三种状态。一种是入门级的丫丫学步,一种是刚刚骑上自行车的小伙反复训练,一种是分门别类的原理阐述。 我...

                                     入门到第一次中断

    去年的工作太忙,工作知识涉及面又广,大量学习的是管理经验,以及半导体检测设备现场故障处

    理。下了班每天学一个小时软件,几个月过后,学习了有一百个小时。就没有然后了。

    正如一切自学那样,走弯路是常态,找对路是运气。显然,那一百个小时,我并没有找对路。

    我以为,书籍分为三种状态。一种是入门级的丫丫学步,一种是刚刚骑上自行车的小伙反复训练,一种是分门别类的原理阐述。

    我只需要找对书籍,按部就班就可以步入殿堂。 事实上,我这种想法太过于简单。

    但是,新时代的今天,额。。。。应该说,这几年的今天。视频,在线学习网站,远程虚拟桌面,等更为高效率。书籍更多成了一个查阅的辅助工具。

                                            六个月   短暂的电子工程师生涯

    下半年,回到家,找了分石油行业的单片机开发工作。实际上被骗过去当电工。

    期间,花了五天学习51单片机,protus仿真,照抄了十来个项目。之后花了,四天学习stm32,还买了开发板。买了火哥的书看了一大半。

    后来又说要搞什么上位机开发,说是要用labview 又学了一两天。后来又说要做滤波电路。让我学习AD软件,熟悉电子元器件。

    然后,学习滤波电路。于是,用了一星期学习模拟电路,学习放大电路,然后,用了两天学习原理图制作。然后用了一天焊电路板。然后,又说要搞上位机开发,又让学C# asp.net   

    终于在折腾了我一两个月,看了上十本书之后。又当上了电工,接线,压端子,拧螺丝,安装仪器仪表,走线,布线,调参数。

                                                                          小城市的悲哀

    石油这个封闭的行业,想来随着汽车行业一起发展到了顶峰。不出意外的话,应该处在一个持续下降的。

    小城市的悲哀是,他需要什么都会的工程师,却给不起钱。找来应届生,却缺乏配套产业,没有换工作的机会,没法晋升。来了走走了来。留也留不住。如此恶性循环,越来越差。最后,你只能选择离开,或者苟且的没心没肺的活着。

    小城市的公司少,大公司也少,小公司不多。人才就更少了,吸引不到外地的人才,紧着一点点人力资源死命的用。

    大约,需要我会现场通信协议,因为单片机需要写设备间通讯程序,会电气自动化,PLC编程,变频器调参,伺服调参,负载计算,电器选型,电气原理图设计,设备安装调试维修,会机械制图,会电力电气电子,模拟电路设计,单片机外围电路,滤波电路,单片机开发,软件编程,数据库,操作系统,会电工接线,会现场项目管理,会嵌入式开发。。。。。经过我不懈努力,我已经朝一个全能型的酱油角色越走越近。

    所以,我决定,辞职,学习上位机开发,数据库操作。我就说,不要逼我,你敢逼我,我就敢什么都会。

                                                               第二次入门到放弃

    走亲访友,赶人情吃酒席。浪费了我大量的时间。我刚刚选好了刘铁猛的视频准备学习。结果就这样吧诶打断了。一打断就是半个月。

                                                               肺炎疫情帮助了我  第三次入门

    响应号召,全国封锁,尤其是湖北,每天看肺炎求助超话,看着疫情突飞猛进,攻城略地。一晃过去半个月。经过,两周的思想准备。我又又又开始,自学编程了。这离第一次产生想法到现在,已经过去一年半了。

    从一天,两小时学习,三小时,四小时。一天看一集视频,到跟着敲代码。一直学到委托,事件,泛型,SQL。。一晃又过去一星期了。这一次,真的是进入状态了。没有任何人可以打扰我,除了我自己。老婆,还有狗。

    我相信,再过一个月,我应该能独自做一些小项目了。现在卡在了SQL数据库这里。

     

     

     

    展开全文
  • C#安装和基础学习

    2016-11-06 14:57:24
    C#安装学习C#视频链接:http://www.bilibili.com/video/av1422127/可以到官网查看安装包或百度下载 下载地址:https://www.visualstudio.com/zh-hans/(官网下载的很容易安装失败啊,还是按照下方的地址安装吧)...

    C#安装

    学习C#视频链接:http://www.bilibili.com/video/av1422127/

    可以到官网查看安装包或百度下载
    下载地址:https://www.visualstudio.com/zh-hans/(官网下载的很容易安装失败啊,还是按照下方的地址安装吧)

    VisualStudio2015安装参考教程:

    1. 下载和安装教程
      http://wenku.baidu.com/link?url=Iwl6j7cJ4VogwEUIzN3DTlQmmjtwb3B6t1UUDEB8SPSSeXz-APMD058c55MWvJmk1Y_Qlodjy0i9kN3S9bJnuX1qjCub6PRcUIV3XtbHiDO
    2. 使用百度网盘下载ed2k方法

    基础知识

    编码规范

    这里写图片描述

    初识C#代码

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                const string CITY = "布宜诺斯艾利斯";//常量,城市
                const string NAME = "列奥波尔多·福图纳托·加尔铁里·卡斯特利";//常量,姓名
                Console.WriteLine(NAME+"出生在"+CITY+"的一个工人家庭");//使用常量
                Console.Write('hello word');//输出不换行
            }
        }
    }
    1. ///是文档注释,只能写在类、方法、属性的前面。不能用来注释单个变量。
    2. c#中的关键字都是小写,比如static,namespace ,void ,const ……..
    3. double关键字表示一种数据类型——双精度浮点型。const才是声明常量的关键字。
    4. C#中没有boolean类型

    C#的数据类型

    我们知道声明变量需要写出数据类型,我们今天要学习的是最常用的几种类型。
    字符类型 char ,存储用 ” (单引号)括起来的一个字符,例如:

    char sex='男';//存储性别

    字符串类型 string ,存储用“”(双引号)括起来的一串字符,例如:

    string address="北京市宣武区牛街北口";//存储地址

    整数类型 int ,存储整数,例如:

    int age=23;//存储年龄

    双精度浮点型 double ,存储小数,例如:

    double salary=7991.63;//存储工资

    以上四种是最常用的数据类型,其他常用类型,我们会随着深入慢慢介绍。

    需要注意的是,某种类型的变量,只能存储这种类型的数据,否则,可能会出错。

    C#的类型转换

    有时候真的需要把不同类型的值放在一起运算,比如这种:3.5+8 这时候怎么办呢?有下面2种情况:

    自动类型转换:
    (只能由精度低的自动转换为精度高的,不能由精度高的转为精度低的)
    2种不同类型的数据运算,低精度类型会自动转换为较高精度的类型。
    以3.5+8为例,显然数字8的精度较低(int),而3.5的精度较高(double),所以,8会自动转换为double型,即转换为3.5+8.0进行运算,结果为11.5。

    请看这个例子:double d=2; 2的精度显然低于变量d的精度,所以2会自动转换为2.0然后赋值给d。
    再看这个例子:int i=3.0;变量i的精度低于3.0,但是由于i已经声明为int型的变量,变量的值可以变,但变量的类型可不能变来变去的,所以这条命令会出错的。

    强制类型转换:
    无法自动转换为我们需要的类型,可以用强制类型转换,比如上例可以这样完成:

    int i=(int)3.0;
    
    int i = 2.3;//double型的2.3赋值给int型变量i,double型精度高,无法自动转换为int类型,所以会出现编译错误。

    数字前面的(int)表示转换的目标类型为int,3.0会被强制转换为3。
    需要注意, double 型强制转换为int型将失去小数部分,比如(int)2.8,我们得到的将是2。

    C#标识符的命名规则

    程序中的变量名、常量名、类名、方法名,都叫做标识符。C#有一套标识符的命名规则,如果命名时不遵守规则,就会出错。这套规则简单说有下面三条:

    ①标识符只能由英文字母、数字和下划线组成,不能包含空格和其他字符。

    错误的标识符声明:

    string $user; //错在使用了其他字符

    ②变量名不能用数字开头。

    错误的标识符声明:

    double 6h;//错在用数字开头

    ③不能用关键字当变量名。

    错误的标识符声明:

    char static ;//错在用关键字static做变量名

    C#的算术运算符(一)

    算术运算符中的加、减、乘、除。

    加:+ 。加号有2个用途:当用加号连接两个数字时,会计算出这两个数字的和。比如:

    Console.WriteLine(9+2.2);//输出11.2

    另一种情况,当加号两边包含字符串的时候,会把两边的表达式连接成新的字符串。比如:

    Console.WriteLine(9+"2.2");//输出92.2,因为"2.2"是字符串,所以9也被转换为"9",+起的作用是连接字符串

    减:- 。减号的作用就是减法。比如:

    Console.WriteLine(15-23);//输出-8

    乘:* 。乘号的作用是求2数的乘积。比如:

    Console.WriteLine(0.8*3);//输出2.4

    除:/ 。除号的作用是求2数相除的商。比如:

    Console.WriteLine(2/0.5);//输出4.0

    但是,2个整数相除,结果仅保留整数部分,小数部分会被舍去。

    Console.WriteLine(5/10);//输出0

    C#的算术运算符(二)

    C#中的取余运算符就是%。除号的作用是求2个数字相除的商,而取余运算符%的作用是求两个数字相除的余数。比如:

    Console.WriteLine(19/5);//求19除以5的商,输出3
    Console.WriteLine(19%5);//求19除以5的余数,输出4(商3余4)

    编程中,%常常用来检查一个数字是否能被另一个数字整除。比如下面的代码片段:

    int number = 29;
    Console.WriteLine(number%2);//求number除以2的余数

    如果输出0,表示没有余数,即number能够被2整除(是偶数);如果输出1,表示有余数,即number不能被2整除(是奇数)。

    C#的算术运算符(三)

    这一节学习两个特别的运算符++和–。

    ++,叫做自加运算符。比如你今年18岁,明年长了一岁,用代码写出来是这样:

    int age=18;//今年18岁
    age=age+1;//明年,在今年的年龄上加1岁
    也可以写成这样:
    
    int age=18;//今年18岁
    age++;//明年,在今年的年龄上加1岁
    age++;与age=age+1;作用相同,都是变量的值+1

    –,叫做自减运算符。同理,你今年18岁,用了XX护肤水以后,明年变成17岁了,可以这样写:

    int age=18;//今年18岁
    age--;//等同于 age=age-1;
    另外,age++;与age--;也可以写作++age;或--age;

    但请注意:如果与其他运算在同一语句中,++写在变量前面或后面,算法不一样,请看下例:

    Console.WriteLine(age++);作用等同于下面两句:
    
    Console.WriteLine(age);//先打印
    age=age+1;//后自加
    Console.WriteLine(++age);作用等同于下面两句:
    
    age=age+1;//先自加
    Console.WriteLine(age);//后打印

    你看,运算顺序不一样吧,所以输出的结果也不会相同。

    C#的比较运算符

    比较数字大小,或者比较数字相等的运算符是比较运算符。C#中的比较运算符有:

    ==  //等于
    >  //大于
    <  //小于
    >= //大于等于
    <= //小于等于
    != //不等于

    注意:表示两个值相等的“等于”是由2个“=”组成的。

    比较运算的结果,都是布尔类型( bool ),bool类型我们是第一次提到,它表示逻辑上的真(成立)与假(不成立)。真与假用关键字 true 和 false 表示。

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                double x = 3.5;
                int y = 3;
                Console.WriteLine((int)x==y);// 结果:true
            }
        }
    }

    C#的逻辑运算符(一)

    逻辑运算符用来连接多个 bool 类型表达式,实现多个条件的复合判断。C#中的逻辑运算符包括:逻辑非( ! )、逻辑与( && )、逻辑或( || )。

    逻辑非用来对某一个 bool 类型表达式取反,即“真变假”或“假变真”。请看下面的代码:

    Console.WriteLine(1 > 0);//条件表达式为true,输出True
    Console.WriteLine(!(1 > 0));//用逻辑非对条件表达式取反,输出False

    逻辑与用来判断 2 个 bool 类型表达式是否同时为 true 。请看下面的代码:

    int x = 5, y = 2;//同时声明2个int型变量并赋值
    Console.WriteLine(x>3 && y>3);//判断x>3和y>3是否同时为true,由于y>3为false,所以整个表达式为false

    只有当&&两边的表达式均为 true 时,整个表达式才为 true ;若任意一个表达式为 false ,整个表达式即为 false 。

    逻辑或用来判断2个 bool 类型表达式中是否有一个为 true 。请看下面的代码:

    int x = 5, y = 2;//同时声明2个int型变量并赋值
    Console.WriteLine(x>3 || y>3);//判断x>3和y>3是否有一个为true,由于x>3为true,所以整个表达式为true

    只要||两边的表达式有一个为 true ,整个表达式即为 true ;若两边的表达式均为 false ,整个表达式为 false 。

    对比一下,就是说: && 运算符,两边同真才算真,一边为假就算假; || 运算符,一边为真即为真,两边同假才是假。

    C#的赋值运算符

    前面,我们已经学过一个赋值运算符“=”,这次我们学习一下其他的赋值运算符:

    加赋值“+=”:先加后赋值。请看下面的例子:

    int x=5;
    x += 2;//这句等同于x=x+2;执行后,x的值为7

    减赋值“-=”:先减后赋值。请看下面的例子:

    int x=5;
    x -= 2;//这句等同于x=x-2;执行后,x的值为3

    乘赋值“*=”:先乘后赋值。请看下面的例子:

    int x=5;
    x *= 2;//这句等同于x=x*2;执行后,x的值为10

    除赋值“/=”:先除后赋值。请看下面的例子:

    int x=5;
    x /= 2;//这句等同于x=x/2;执行后,x的值为2

    取余赋值“%=”:先取余后赋值。请看下面的例子:

    int x=5;
    x %= 2;//这句等同于x=x%2;执行后,x的值为1

    与其他运算符从左向右计算不同,赋值运算符从右向左计算。

    C#的运算符优先级

    前面我们学习了那么多运算符,如果编程中同时使用了多个运算符,到底哪一个会先运算呢?这就是优先级的问题。C#运算符的优先级请参考下面的顺序:

    ①括号。学数学的时候我们就知道,要先计算括号里面的内容。C#语言也是一样,如果有多层括号,要从里向外计算。括号优先级最高。

    ②一元运算符。有些运算符两边有2个操作数,比如2+3、6%5等等,这些叫做二元运算符。只有一个操作数的叫做一元运算符,它们的优先级高于二元运算符。一元运算符包括:++(自加) 、 –(自减) 、 !(逻辑非)。

    ③*(乘)、/(除)、%(取余)。

    ④+(加)、-(减)。

    ⑤>(大于)、<(小于)、>=(大于等于)、<=(小于等于)。

    ⑥==(等于)、!=(不等于)。

    ⑦&&(逻辑与)。

    ⑧||(逻辑或)。

    ⑨赋值运算符。包括:=、+=、-=、*=、/=、%=。

    另外,还需要注意一点:优先级相同的运算符从左向右计算(赋值运算符相反)。

    请看下面这段代码:

    bool b = 20 - (15 - 8) * 2 > 10 && (2 % 2 * 2 + 2) > 2;
    Console.WriteLine(b);

    分析:首先计算优先级最高的括号,(15-8)得到7,(2%2*2+2)则需要先计算%和*,后算+,结果是2,表达式就变成了:

    bool b=20 - 7*2 >10 && 2>2;

    接下来优先级最高的是7*2,然后是减法,变成:

    bool b = 6 > 10 && 2 > 2;

    继续计算两个大于号,得到:

    bool b=false && false;

    最后的结果当然是false

    C#用流程图描述程序逻辑
    流程图是程序步骤的图形化表示方法。流程图中包括如下符号:
    这里写图片描述

    以上图形中,流程线用来连接相邻的两个步骤;每一个程序都有且仅有一个开始和结束。

    参考下面的流程图,完成代码。
    这里写图片描述

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                double x = 13.9, y = 24.4;
                double sum = x + y;
                double avg = sum /2;
                Console.WriteLine(avg);
            }
        }
    }

    C#中判断和分支
    走到岔路口,需要选择方向。编写程序也会遇到判断和分支。请看下面的流程图,判断手机账户余额是否不足10元,如果不足给出提示:
    这里写图片描述
    这个程序在“balance<10”这个步骤出现了分支,“balance<10”被称为判断( bool 类型),当判断为 true 时,执行左边的分支,输出提示;当判断为 false 时,执行右边的分支,不输出任何内容。

    在C#中,这个结构成为条件结构,通常用 if 关键字来实现:

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                double banlance = 9.78;//余额
                if(balance < 10)
                {
                    Console.WriteLine("余额不足,请充值);    
                }
            }
        }
    }

    C#中if…else条件结构

    前一节我们学习了 if 条件结构。条件结构可以有2个分支,比如下面的流程图,判断一个整数是奇数还是偶数:
    这里写图片描述
    这个流程图从C#实现如下,其中,条件为 true 时执行的分支写在 if() 后面的{}中;条件为 false 时执行的分支写在 else 后面的{}中。
    这里写图片描述
    这个由 if 和 else 组成的结构是条件结构的一种,它的基本逻辑是:当条件为 true 时,执行分支1,否则,执行分支2。这段程序中,变量num能够被2整除时会执行分支1,不能被2整除时执行分支2。

    每一个 if…else 结构都包含 1 个条件和 2 个分支,而程序会根据条件的真与假,选择执行其中的某一个分支。条件必须为 bool 类型的表达式。

    C#中嵌套的if结构

    程序开发中,往往需要先判断一个条件是否成立,再判断另一个条件。比如下面的例子:验证账号是否为“admin”,如果不是则提示错误;如果是,则验证密码是否为“bj2022”:

    这里写图片描述

    用C#实现如下:

    这里写图片描述

    C#中多重if结构

    如果,有多个条件,其中只有一个成立,应该怎样判断呢?比如小明考试,90分以上奖励一台手机,80-89分奖励一个滑板,60-79分奖励一个烧饼,60以下没有奖励,0-100的分数被划分为4档,需要做3次条件判断。如果用上一节学习的嵌套if结构完成,3层if的嵌套会使程序变得很复杂。本节我们使用多重 if 结构实现,它的基本语法为:
    这里写图片描述
    程序运行时,将从上到下依次判断条件,若某个条件为 true ,则执行对应的分支,并且停止后面条件的判断。比如下面的代码,将输出“奖励一个烧饼”:
    这里写图片描述

    C#中else与if的匹配

    if…else 条件结构中,如果某个分支只包含一条命令,那么是可以省略大括号{}的。比如上一节的练习,可以简化为:
    这里写图片描述

    请注意,如果分支中包含2条以上的命令,是不能省略{}的。

    C#的条件运算符

    C#提供了一种条件运算符,能够代替简单的 if…else 结构。这种条件运算符的语法如下:

    条件表达式 ? 分支1 : 分支2

    ?: 就是条件运算符,可以看到它有3个操作数,所以又被称为三元运算符
    它的运算逻辑是:当条件表达式为 true 时,执行分支1;当条件表达式为 false 时,执行分支2。

    下面的例子中,根据年龄的大小,输出“成年人”或“未成年人”:
    这里写图片描述

    C#的switch结构

    if…else 之外,C#中还有一种 switch 条件结构,可以用来对变量进行多个分支的等值判断。
    语法如下:
    这里写图片描述
    (变量)与每一个 case 后面的常量进行等值比较,如果相等,就执行对应的分支。执行分支以后, break 关键字会使 switch 结构中止,不会再判断后面的常量。如果变量与所有的常量都不相同,则执行 default 后面的分支。

    下面的代码,根据运算符完成了四则运算中的一项:
    这里写图片描述
    上面的代码,因为变量oper的值与 case ‘*’ 匹配,所以会输出乘积“18”。

    switch 中的(变量)只能是3种类型:整型(如 int )、字符型( char )、字符串类型( string )。

    C#循环流程图和while循环

    这里写图片描述
    这个循环结构,会首先判断 x<=10 ,条件为真时执行循环体(“输出x”和“x++”),之后,再次判断条件 x<=10 ,若条件为真则继续执行循环体……若条件为假,则结束循环。

    简单的说,循环是由循环体(需要重复执行的命令)和循环条件组成的。运行时,先判断循环条件,若条件为 true ,就执行循环体一次,然后再判断条件…当条件为 false 时,结束循环。上面的流程图,当变量 x 累加到 11 时,循环条件为 false ,循环就会结束。

    C#中,可以用 while 循环结构来实现:
    这里写图片描述

    C#中do…while循环

    C#中, do…while 循环也是一种常用的循环结构。循环结构各部分运行顺序如下:

    这里写图片描述

    从上面的示意可以看出, do…while 循环第一次执行循环体是没有经过条件判断的,也就是说会无条件的执行一次循环体,此后的逻辑

    顺序就与while循环相同了——先判断条件,条件为true再执行循环体一次。请看下面的例子:
    这里写图片描述
    尽管循环条件始终为 false ,但由于 do…while 循环第一次执行循环体不判断条件,所以循环体还是执行了一次。

    我们已经学习了C#中最常用的三种循环结构,下面我们小小总结一下:
    这里写图片描述

    C#循环结构之continue

    循环中可以应用 continue 关键字中止一次循环,直接进入下一次。请看下面的例子:
    这里写图片描述
    当程序执行到到 continue; 的时候,会立即停止本次循环体,直接进入下一次循环。所以,第三行输出比其他行少一些

    C#循环结构之break

    前面学习 switch 结构时,我们曾经遇到过 break 关键字, break 在 switch 结构的作用是“跳出 switch 结构”。
    break 关键字还可以用在循环中,作用是“结束循环”。下面的循环代码中,当 x==3 的时候会执行 break :
    这里写图片描述
    对比代码和运行结果可知,当执行到 break ,循环结束(尽管此时循环条件仍然为 true )。

    利用 break 关键字和 true 关键字,我们可以用另一种方式编写循环,下面的代码是输出1-5的整数:
    这里写图片描述

    C#的声明数组和赋值

    编程中有这样一种情形:我们需要存储多个同类型数据。比如,保存 1600 个学生的年龄。是否需要声明 1600 个 int 类型的变量?过了一年,学生们长了 1 岁,是否需要给每个变量重新赋值?这件事情,想想就怕怕。好在C#中有一种数组,专门存储一组相同类型的数据。数组的声明和初始化语法如下:

    数据类型[ ] 数组名 = new 数据类型[长度]; 

    注意:数组名像变量名一样要遵循标识符的命名规则;长度必须是整数

    下面我们来比较变量和数组的声明与初始化,右边是在内存中为变量和数组分配空间的示意:

    这里写图片描述

    对比变量 x 和数组 y 就会发现,数组 y 中其实包含了 3 个 double 类型的变量,为什么是 3 个?因为初始化数组时在 [ ] 中声明的长度为 3 。既然都在数组 y 中,所以 3 个变量(应该叫数组元素)的名字都叫 y ,为了区分它们,按照顺序给它们加上索引 [0]、[1]、[2] 。请注意:数组的索引从 0 开始递增。那么,数组 y 中 3 个元素的名字就变成了 y[0]、y[1]、y[2] 。
    最后再注意一点:
    数组经过初始化以后,数组元素有默认的初始值, double 类型为 0.0 , int 类型为 0 , char 类型为 ‘a’ , bool 类型为 false , string 类型为 null

    数组元素的赋值与普通变量相同。下面的示例中,我们声明了一个长度为 3 的 string 类型数组,逐个赋值,然后打印:
    这里写图片描述

    上例中,需要注意的是元素的索引,数组元素索引从 0 开始递增,所以长度为 3 的数组,其元素索引为 [0]、[1]、[2] 。

    如何知道一个数组的长度呢? 数组.Length 属性会返回数组的长度(即数组元素的个数)。请看下面的例子:

    这里写图片描述

    代码中的 friends.Length 会返回 friends 数组的长度

    C#访问数组元素

    上一节我们学习了数组的声明和初始化,以及数组元素的访问方法。其实,C#中数组元素有多种初始化方式,请看下例:
    这里写图片描述
    上例中,数组 a 的初始化方式我们已经学习过了;数组 b、c、d 是在初始化时为数组元素指定初始值,请注意数组 d 用 [3] 声明了数组长度,后面 { } 中的初始值个数要与 [ ] 中声明的长度相同。数组 b、c 初始化没有声明长度,长度由 { } 中的初始值个数确定。

    上一节我们还学习了数组的一个属性 Length , Length 能够返回数组的长度,利用它和数组元素的索引,我们可以循环访问每一元素。上一节中打印名字的代码,可以这样改进:
    这里写图片描述
    Length 属性返回数组的长度,如上例中,数组长度为 3 , Length 就返回 3 ,即循环变量 i 从 0 循环到 2 。为什么不循环到 3 呢?因为数组元素的索引是从 0 开始的呀!长度为 3 的数组,索引为 0 - 2 。

    通过上例,我们看到,使用数组就能循环访问一组相同类型的变量了,是不是比使用单个变量要轻松呢?

    看下方代码哪里错了:

    using System;
    using System.Collections.Generic;
    using System.Text;
    
        namespace Test
        {
            class Program
            {
                static void Main(string[] args)
                {
                    //声明整型数组,保存一组整数
                    int[] num = new int[] { 3,34,42,2,11,19,30,55,20};
                    //请完善代码,循环打印数组中的偶数
                    for(int i = 0 ; i<num.Length;i++ ){
                        if(num[i]%2 == 0){
                            Console.Write(num[i]+',');//这里不能用单引号,int类型和char类型相加了
                            // Console.Write(num[i]+",");//双引号才是正确的
                        }
    
                    }
                }
            }
        }

    C#的foreach关键字

    for 循环使我们可以通过索引访问数组元素;而 foreach 循环则可以不依赖索引而读取每一个数组元素。下面的示例代码声明了一个整型数组,然后通过两种方法打印数组元素:
    这里写图片描述

    运行结果是相同的

    使用 foreach 的语法:
    这里写图片描述
    需要解释一下 ④ ,如上面的示例代码,迭代变量 x 只能用于读取数组 num 中的值,但是不能给数组元素赋值,如果尝试给 x 赋值,则会有下面的错误提示:
    这里写图片描述
    了解了 foreach 循环的语法,你可能会有疑问:好像 foreach 循环能做的 for 都能做, foreach 存在的意义是什么呢?其实,C#中还存在一些类似于数组的数据组织方式,它们中有一些是没有元素索引的,对于这些元素,只能通过 foreach 遍历。

    查找算法的另一种应用,是检查一组数据中是否包含符合条件的元素,也就是要给出“有”或“没有”的结论。

    要解决这种问题,首先要声明一个“开关变量”,用来记录查找的状态;通常,我们把开关变量初始化为 false ,表示没有找到,循环中如果发现了符合条件的元素,则给变量赋值为 true ,并结束查找。循环结束后,就可以判断开关变量: true 表示“有”, false 表示“没有”。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                //声明整型数组,保存一组整数
                int[] num = new int[] { 3, 34, 43, 2, 11, 19, 30, 55, 20 };
                //请完善代码,判断数组中有没有7的整倍数
                bool has7 = false;//要声明一个“开关变量”
                foreach (int x in num)
                {
                    if (x % 7 == 0)
                    {
                        has7 = true;//如果发现了符合条件的元素,则给变量赋值为 true ,并结束查找
                        break;
                    }
                }
                if (has7)
    
                    Console.WriteLine("有7的整倍数");
    
                else
                    Console.WriteLine("没有7的整倍数");
            }
        }
    }

    C#的二维数组的声明和访问

    二维数组,就是以数组作为元素的数组。挺拗口的,看看它跟一维数组的对比:
    这里写图片描述
    左边的 a 是一维数组,数组中包含 4 个 int 型变量:a[0]、a[1]、a[2]、a[3] 。

    右边的 b 是二维数组,数组中包含 2 个 int 型一维数组:b[0]、b[1] 。而 b[0] 和 b[1] 中又分别包含 3 个 int 型变量:b[0,0]、b[0,1]、b[0,2]、b[1,0]、b[1,1]、b[1,2] 。

    总结一下,二维数组这样声明:

    int[,] arr = new int[2,3]; //包含2个一维数组,每个一维数组包含3个变量,总共2*3=6个数组元素

    二维数组元素这样赋值和打印:

    arr[1,0] = 28; //二维数组元素有2个索引,都是从0开始,以arr数组为例,元素索引从[0,0]到[1,2]
    Console.Write( arr[1,0] );

    我们可以用二维数组管理相关的数据,比如有 4 名同学参加语文和数学两门考试,我们用二维数组存储他们的成绩,每位同学的 2 门课分数,存储在一个一维数组中:
    这里写图片描述

    输出分数最高的同学的姓名和分数

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                string[,] info = new string[8, 2] { { "吴松", "89" }, { "钱东宇", "90" }, { "伏晨", "98" }, { "陈陆", "56" }, { "周蕊", "60" }, { "林日鹏", "9" }, { "何昆", "93" }, { "关欣", "85" } };
                string name = "";
                string score = "";
                for (int i = 0; i < info.GetLongLength(0); i++)
                {
                    if (string.Compare(info[i, 1], score) > 0)
                    {
                        score = info[i, 1];
                        name = info[i, 0];
                    }
                }
                Console.WriteLine("分数最高的是" + name + ",分数是" + score);
            }
        }
    }

    C#通过控制台接收用户输入

    接收用户输入,并输出用户输入的内容

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                string name;
                Console.WriteLine("请输入姓名:");
                name = Console.ReadLine();
               Console.WriteLine("你好," + name);
            }
        }
    }
    
    

    输入5位同学的姓名和分数,求平均分和总分

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                // 输入分数 求平均分
                //声明数组 name
                string[] name = new string[5];
                //声明数组score
                int[] score = new int[5];
                //循环
                for (int i = 0; i < name.Length; i++)
                {
                    Console.Write("请输入" + (i + 1) + "同学的姓名:");
                    name[i] = Console.ReadLine();
                    Console.Write("请输入" + (i + 1) + "同学的分数:");
                    score[i] = int.Parse(Console.ReadLine());//用户输入的是string,这里需要强制转换为int
                }
                int sum = 0;
                int avg;
                for (int i = 0; i < score.Length; i++)
                {
                    sum += score[i];
                }
                avg = sum / score.Length;
                Console.Write("总分:{0},平均分{1}", sum, avg);
            }
        }
    }
    
    

    int类型的接收语句:int.Parse(Console.WriteLine());(Ps:其他类型模仿)

    C#调试程序技巧

    添加/撤销断点:F9,或直接在左侧点击

    调试:F5(第一次开始调试;第二次直接输出结果)

    单步执行:F10(一直按F10,则逐步执行,方便查看结果)

    停止调试:Shift+F5

    注释快捷键:ctrl + k +c
    取消注释快捷键:ctrl + k +u

    导入命名空间:shift + alt +F10

    展开全文
  • 2018.2.9更新:惊了,没想到被度娘推到了第三,翻箱倒柜找出了两年...曾经自学C#做计算机图形学的作业,GDI+画图确实好用,目前在找.NET的实习,尝试做了一个最基本的五子棋,复习一下C#的基本语法,目前只能当跟基...
  • 前段时间自学C#CAD二次开发,遍布网上无教学视频。经过自己艰苦摸索,小有所成。 开此C#CAD二次开发在线学习视频,看能够帮助各位设计院熬夜画图的同僚们一起研究CAD二次开发,提高绘图效率。 觉得感兴趣可以试看...
  • C#自学笔记

    2015-12-11 16:57:03
    第一章.NET框架简介**页的发展包括CGI、脚本语言、组件技术三个阶段 .NET框架由以下五部分组成1、 程序设计语言及公共语言规范(CLS)2、 应用程序平台(ASP.ENT及Windows)3、 ADO.NET及类库4、 公共语言运行库...
  • csharp基础练习题:欢迎...请注意,name将是一个由一个或多个值组成的数组,这些值应该连接在一起,每个值之间有一个空格,并且测试用例中name数组的长度会有所不同. 例: sayHello(['John','Smith'],'Phoenix','Arizona...
  • .Net(C#)基础教程

    2019-08-26 17:26:45
    我要自学网>http://www.51zxw.net/study.asp?vip=18162852,讲的很仔细(搜索C#或者.Net,视频都是分的细的那种,学习C#的小白能立马上手,本人也是小白,要是你们有.Net/C#的资源,希望能分享,一起加油学习~~~) 基础...
  • 1、C语言的时代 在C语言时代,可以认为那时的编程过程就是表格加工过程,也就是从A表格到B表格、再到C表格…..等等,这个过程中,计算机语言如何描述一个表格,成为计算机语言的关键。 对一个表格的分析可以发现:...
  • csharp基础练习题:唯一的字符串中的字符【难度:1级】: 在这习题,你会得到两个字符串了和B,你的任务是返回不在两个字符...还要注意的是,你从那些从第二个字符串连接在一起的第一个字符串返回字符. 在测试的情况下更多...
  • ==============================翻译============================== 运行该应用程序并浏览到Movies控制器通过将/Movies追加到您的浏览器的地址栏中的 URL。将鼠标指针悬停在编辑链接,看到它链接到的 ...
  • C#登录注册程序

    2017-06-15 16:18:28
    自学C#,练习。登录注册窗体,功能:点击注册将输入的信息储存在sqlserver数据库中,并判断账号是否已被注册过(数据库中是否已有该账号),点击登录若账号密码信息数据库中已存在即登录成功。 欢迎新手一起学习~望...
  • csharp基础练习题:简单有趣#154:零和一【难度:1级】: 任务 你必须由零和一的长度为n的字符串.考虑以下操作: 选择字符串中的任何两个相邻的位置 如果它们中的一个是0,而另一个为1, 从字符串中删除这两个数字. ...
  • csharp高级练习题:ASCII85编解码【难度:3级】: ASCII85是公司的PDF和Postscript内使用的二进制到ASCII编码方案,并在基地64.你的任务是两个新的方法来扩展String对象, toAscii85 (节约了数据大小节约了数据大小...
  • C# Winform自学笔记第五篇,上接(四) ①单选按钮RadioButton ;② 图片框 PictrueBox ;③选项卡控件 tabControl; ④选项卡控件 tabControl; ⑤进度条控件 progressBar1;⑥图片列表 ImageList;
  • 本书既适合作为C#完全自学图书,也适合作为相关培训机构的培训教材或者高校计算机类专业C#语言课程的参考教材。这是第一个压缩包。第二个包地址:https://download.csdn.net/download/wosingren/10463468
  • 我现在数据库有三个表Phone1,Phone2,Phone3.想利用union把Phone1,Phone2的数据插入到第三...求各位大神给段实例代码,不要仅仅给个sql语句,小弟刚刚自学C#,对C#操纵数据库还不是很熟悉,求完整代码。感激不尽啊。
  • C#笔记(一)

    2015-08-12 21:54:34
    C#自学笔记
1 2 3 4 5 ... 20
收藏数 3,878
精华内容 1,551
热门标签