C# 记录

616 阅读3分钟

visual studio快捷键

快捷键 说明
Tab 向右缩进
Shift+Tab 向左缩进
Ctrl + K + D 选中代码对齐
Ctrl + L 删除行
Ctrl + D 复制行
Alt + 上下箭头 上下移动
Ctrl + K + C 注释
Ctrl + K + U 取消注释

一. 打包安装程序

1. 点击解决方案,右键添加 -> 新建项目

image.png

2. 选择Setup Project

image.png

3. 生成工包台项目

image.png

4. 右键Application Folder,添加项目输出,选择Workable项目

image.png

选择Workable

5. 确定后生成界面

image.png

6. 添加快捷方式

image.png

7. 新建2个快捷方式,分别拖到左边的文件夹

image.png

8. 设置项目的属性

image.png

9. 生成安装包

image.png

image.png

10. 打包发布版本

Debug切换到Release,重新生成即可。

Release

二. 语法

1. vs code 运行报错

[Running] scriptcs "/Users/zz/Projects/c#/demo1/demo1.cs"
/bin/sh: scriptcs: command not found

解决:使用安装脚本

brew install scriptcs

2. VS折叠代码

#region 这里写注释
#endregion

3. C# 5新的格式化输出格式 $

string str = "abc"

老版本
Console.WriteLine("Hello World {0}" + "abd  ", str);

新版本
Console.WriteLine($"Hello World {str}");

4. mysql中表NameTable的自增id插入数据:idnull或者不传id字段、其他字段写完整。

string sql = string.Format("insert into NameTable values(null,'{0}','{1}'')", list[0], list[1]);

5. 委托delegate

namespace Demo1
{
    /// <summary>
    /// 委托
    /// </summary>
    class DelegateDemo
    {
        delegate int MyDelegate(int a, int b, int c = 0);

        int add(int a, int b, int c)
        {
            return a + b + c;
        }
        int add1(int a, int b, int c)
        {
            return a + b + c;
        }
        int add2(int a, int b, int c=10)
        {
            return a + b + c;
        }

        public void test()
        {
            MyDelegate md = new MyDelegate(add);
            MyDelegate md1 = new MyDelegate(add1);

            Console.WriteLine("rst = " + md(1, 2, 4));

            md += add1;
            Console.WriteLine("rst1 = " + md(1, 2, 4));

            md = add2;
            Console.WriteLine("rst2 = " + md(1, 2));

            MyDelegate myN;
            myN = md + md1;
            Console.WriteLine("rst2 = " + myN(11, 32, 8));
        }
    }
}

main

    DelegateDemo dd = new DelegateDemo();
    dd.test();

6. 事件Event

namespace Demo1
{
    /***********发布器类***********/

    class EventDemo
    {
        public delegate void DlPrintValueHandler(int value);

        //事件
        public event DlPrintValueHandler dlMethod;

        //构造方法
        public EventDemo()
        {
            changeValue(4);
        }

        //触发代理事件
        public void changeValue(int value)
        {
            if (dlMethod != null)
            {
                dlMethod(value);
            }
            else
            {
                Console.WriteLine("event not fire");
            }
        }
    }

    /***********订阅器类***********/

    public class subscribEvent
    {
        public void log(int value)
        {
            Console.WriteLine($"subscribEvent.log({value})");
        }
    }
}

main

static void eventDemo() 
{
    EventDemo e = new EventDemo(); /* 实例化对象,第一次没有触发事件 */
    subscribEvent v = new subscribEvent(); /* 实例化对象 */

    e.dlMethod += new EventDemo.DlPrintValueHandler(v.log); /* 注册 */
    e.changeValue(7);
    e.changeValue(11);
}

7. 输入日志

namespace Demo1
{
    class LoggerDemo
    {
        FileStream fs;
        StreamWriter sw;

        public LoggerDemo(string filename)
        {
            fs = new FileStream(filename, FileMode.Append, FileAccess.Write);
            sw = new StreamWriter(fs);
        }

        public void Logger(string info)
        {
            sw.WriteLine(info);
        }
        public void Close()
        {
            sw.Close();
            fs.Close();
        }

        /// <summary>
        /// 写文件多种方法
        /// </summary>
        private void fileOutput()
        {
            //1
            FileStream fs = new FileStream("test.dat", FileMode.OpenOrCreate, FileAccess.ReadWrite);
            fs.WriteByte(0x63);
            fs.Close();

            //2
            StreamWriter sw = new StreamWriter("test1.dat");
            sw.Write("aaa1");//不换行
            sw.WriteLine("b1");//换行
            sw.Close();

            //3
            File.WriteAllText("test2.txt", "halo nihoa");
        }

        /// <summary>
        /// 追加到固定文件
        /// 自动释放
        /// </summary>
        /// <param name="content"></param>
        private void log(string content)
        {
            using (FileStream fs = new FileStream("log1.log", FileMode.Append, FileAccess.Write))
            {
                StreamWriter sw = new StreamWriter(fs);
                sw.WriteLine(content);
                sw.Close();
            }
        }
    }
}

main

static void logger()
{
    LoggerDemo ld = new LoggerDemo("log.c");
    ld.Logger("halo");
    ld.Logger(", world");
    ld.Close();
}

8. 泛型Generic

namespace Demo1
{
    /// <summary>
    /// 泛型
    /// </summary>
    class GenericDemo<T>
    {
        private T[] array;
        private ArrayList list;

        //泛型委托
        delegate T GenericMethod<T>(T value);

        public GenericDemo(int size = 0)
        {
            list = new ArrayList();
            //array = new T[size + 1];
        }

        public T getItem(int index)
        {
            return (T)list[index];
            //return array[index];
        }
        public void setItem(int index, T value)
        {
            list.Add(value);
            //array[index] = value;
        }

        public int getSize()
        {
            return list.Count;
            //return array.Count();
        }

        //代理
        public int gLog(int value)
        {
            Console.WriteLine("泛型log int " + value);
            return value;
        }
        public string gLogString(string value)
        {
            Console.WriteLine("泛型log string: " + value);
            return value; 
        }

        public void dddl()
        {
            GenericMethod<int> gm = new GenericMethod<int>(gLog);
            gm(45);
            GenericMethod<string> gmString = new GenericMethod<string>(gLogString);
            gmString("string 46");
        }
    }
}

main

static void genericDemo()
{
    Console.ForegroundColor = ConsoleColor.Yellow;
    Console.WriteLine("====================");
    Console.WriteLine("genericDemo");
    Console.ResetColor();

    GenericDemo<String> gd = new GenericDemo<string>(1);
    gd.setItem(0, "aa");
    gd.setItem(1, "bb");
    gd.setItem(2, "cc4");
    gd.setItem(2, "cc5");
    gd.setItem(6, "cc6");
    gd.setItem(2, "cc7");

    for (int i = 0; i < gd.getSize(); I++)
    {
        Console.WriteLine(gd.getItem(i));
    }
}

9. 匿名函数 Anonymous methods

namespace Demo1
{
    class AnonymousMethod
    {
        delegate void AmDelegateHandler(int n);

        void MultNum(int q)
        {
            Console.WriteLine("MultNum Method: {0}", q);
        }

        public void test()
        {
            AmDelegateHandler adHand = delegate (int value)
            {
                Console.WriteLine($"delegate: {value}");
            };
            adHand(34);

            adHand = new AmDelegateHandler(MultNum);
            adHand(46);
        }
    }
}

main

static void anonymousMethodDemo()
{
    AnonymousMethod am = new AnonymousMethod();
    am.test();
}

10. 事件 event

让别的类调用自己的 ecLog() 方法

事件只能在本类中调用 其他类只能订阅

namespace Demo1
{
    class EventClass
    {
        /// <summary>
        /// 让别的类调用自己的 ecLog() 方法
        /// </summary>
        public EventClass()
        {
            OtherClass oc = new OtherClass();
            oc.ocLog();

            //关联方法 “OtherClass.md”只能出现在 += 或 -= 的左边(从类型“OtherClass”中使用时除外)
            oc.md += ecLog;
            oc.ocLog();

            oc.md += new MyDelegate(ecLog);
            oc.ocLog();
        }
        void ecLog()
        {
            Console.WriteLine("ecLog()");
        }
    }


    /// <summary>
    /// 提供事件接口
    /// </summary>
    delegate void MyDelegate();
    class OtherClass
    {
        //事件只能在本类中调用 其他类只能订阅
        public event MyDelegate md;

        public void ocLog()
        {
            if (md != null)
            {
                Console.WriteLine("ocLog()");
                md();
            }
            else
            {
                Console.WriteLine("no ocLog()");
            }
        }
    }
}

11. 对话框Dialog

  • OpenFileDialog 打开文件对话框,从FileDialog类继承,提示用户打开文件,无法继承此类。对于文件的打开操作属于比较常见的。
  • SaveFileDialog 保存文件对话框,从FileDialog类继承,提示用户选择文件的保存位置。无法继承此类。
  • FolderBrowserDialog 目录浏览对话框,从CommonDialog类继承,提示用户选择文件夹。无法继承此类。
  • FontDialog 字体设置对话框,从CommonDialog类继承,提示用户从本地计算机上安装的字体中选择一种字体。可继承该类。
  • ColorDialog 颜色设置对话框,从CommonDialog类继承,表示一个通用对话框,该对话框显示可用的颜色以及允许用户定义自定义颜色的控件。可继承该类。
  • PageSetupDialog 打印页面设置对话框,从CommonDialog类继承,允许用户更改与页面相关的打印设置,包括边距和纸张方向。无法继承此类。
  • PrintDialog 打印对话框,从CommonDialog类继承,允许用户选择一台打印机并选择文档中要打印的部分。无法继承此类。
  • PrintPreviewDialog 打印预览对话框,从Form类继承,表示包含 PrintPreviewControl 的对话框窗体。可继承该类。由于该类从Form类继承,所以除了通过 PrintPreviewDialog.ShowDialog (); PrintPreviewDialog.ShowDialog (IWin32Window); 方法以模态方式打开窗体外,还可以通过PrintPreviewDialog.Show ();或其重载PrintPreviewDialog.Show (IWin32Window);方法按正常非模态方式打开。

12.

13.