第二天:2017-09-11
1、每次代码更新,最好都进行“重新生成解决方案: clt + b + b” 。不然就像我一样被坑了半个小时
2、有什么快捷键导致选中的代码全部变成小写。
改成小写:Ctrl+U
改成大写:Ctrl+Shift+U
由于这和注释的快捷键很相似(Ctrl + K + U)。误操作,结果被坑了半个小时。所以以后想办法避免:
Top Tool Bar -> 工具 -> 选项 -> 键盘 -> 显示命令行中输入 “小写” -> 选中“编辑.转换为小写” -> 移除快捷键
3、C# 做单元测试就是这么简单
新建一个单元测试项目打开源代码文件UnitTest1.cs,输入以下代码
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Test
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
int a = 100;
int b = 200;
Console.WriteLine("123");
Assert.AreEqual(b - a, 100);
}
}
}
接下来就是重点了。Top Tool Bar -> 测试 -> 窗口 -> 测试资源管理器右键我们第一个测试方法: TestMethod1
稍等一会就能看到成功的信息:
那我们的 Console.WriteLine 输出的信息在哪里?
我们点击上图的 “输出” 链接就可以看到了
4、难以忍受的文件夹目录
在项目目录中,由于单元测试项目的引用依赖,会自动生成一个packages文件夹。显得格格不入。身为简洁的程序员我绝对不能忍。首先将 packages 剪切进 单元测试项目的文件夹,这里我是 TestApp 文件夹
并且打开单元测试项目下的 .csproj 文件。搜索所有关于 ..\packages 路径的代码, 全部替换为 .\packages 保存即可。
重新生成并且运行单元测试。一切正常。但发现那个讨厌的 packages 文件夹又出现在不该出现的位置。这是由于项目下
packages.config 文件导致的,每次重新编译生成时就会体贴的自动生成,但是我们的项目已经有引用了。所以已经不需要了。
所以,最后一句就是将 packages.config 文件删除。
5、WindowForm 每次都需要手动重新生成? 这也太麻烦了吧
解决方案:Top ToolBar -> 生成 -> 配置管理器 -> 生成全部勾选(√)
6、webBrowser的使用
入门: 从工具箱中拖一个 webBrowser 入界面。然后就可以来测试了。
private void button12_Click(object sender, EventArgs e)
{
try {
this.webBrowser1.Url = new Uri(this.textBox11.Text);
} catch (Exception ex) {
MessageBox.Show("URL格式有问题,请确保不为空并且包含 http:// 或者 https:// \r\n\r\n" + ex.Message);
}
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserNavigatedEventArgs e)
{
// 显示转换
WebBrowser wb = (WebBrowser)sender;
MessageBox.Show("加载完毕");
MessageBox.Show(wb.DocumentTitle);
MessageBox.Show(wb.DocumentText);
}
进阶: 脱离了控件,通过代码创建WebBrowser并且绑定事件
private void button12_Click(object sender, EventArgs e)
{
try {
WebBrowser wb = new WebBrowser();
wb.Url = new Uri(this.textBox11.Text);
wb.Navigated += webBrowser1_Navigated;
} catch (Exception ex) {
MessageBox.Show("URL格式有问题,请确保不为空并且包含 http:// 或者 https:// \r\n\r\n" + ex.Message);
}
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserNavigatedEventArgs e)
{
// 显示转换
WebBrowser wb = (WebBrowser)sender;
MessageBox.Show("加载完毕");
MessageBox.Show(wb.DocumentTitle);
MessageBox.Show(wb.DocumentText);
}
知识点:
webBrowser1_DocumentCompleted 是 页面加载完成事件
绑定事件是用 += ,何况编辑器也会智能提示你这样做啦。
object sender 就是我们通过代码创建的WebBrowser,虽然我知道,但我就是用不了,通过看别人的博客和代码,才知道这里需要显示转换(WebBrowser)类型。
7、圣战:大括号打死不换行!!!
工具 → 选项 → 文本编辑器 → C# --> 代码样式 --> 格式设置 --> 新行 --> 全部取消勾选
(PS:推荐保留类和方法,视觉而言代码的层次感鲜明,有利于提高代码可读性)
8、lambda表达式函数 + 函数作为参数传递 + Action<T> 与 Func<T>
Action<T>:lambda函数必须没有返回值
static void Main(string[] args)
{
int aa = TestLambda(fuck => {
Console.WriteLine(fuck);
});
Console.Write(aa);
Console.ReadLine();
}
public static int TestLambda(Action<string> action)
{
action("fuck");
return 123;
}
Func<T>:lambda函数必须具有返回值,且返回的值必须符合Func定义的最后一个参数的类型(在demo中是int类型,于是我返回1234)。
static void Main(string[] args)
{
int aa = TestLambda(str => {
Console.WriteLine(str);
return 1234;
});
Console.Write(aa);
Console.ReadLine();
}
public static int TestLambda(Func<string, int> action)
{
// 调用这个函数,并且传递一个值
return action("Hello World");
}
9、如何在 WebBrowser 中截图
入门:手动添加webBrowser控件并且手动绑定DocumentCompleted事件来实验。
// 点击的时候加载页面
private void button_Click(object sender, EventArgs e)
{
this.webBrowser1.Url = new Uri("http://www.baidu.com");
}
// 加载页面完毕后触发,因为必须等页面加载完毕后截图才有意义
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
int width = 322;
int height = 411;
Bitmap bitmap = new Bitmap(width, height);
Rectangle rectangle = new Rectangle(0, 0, width, height);
this.webBrowser1.DrawToBitmap(bitmap, rectangle);
// 保存图片对话框
// SaveFileDialog saveFileDialog = new SaveFileDialog();
// saveFileDialog.Filter = "JPEG (*.jpg)|*.jpg|PNG (*.png)|*.png";
// saveFileDialog.ShowDialog();
// Console.WriteLine(saveFileDialog.FileName);
// bitmap.Save(saveFileDialog.FileName);
bitmap.Save("c:\\123.jpg");
}
进阶:通过代码生成 WebBrowser 实例 并且 通过代码绑定 DocumentCompleted 事件,事件的函数也直接使用lambda表达式函数来快速编写。
/// <summary>
/// 截取WebBrowser网页中的图片
/// </summary>
/// <param name="webBrowser">WebBrowser实例对象</param>
/// <param name="width">宽</param>
/// <param name="height">高</param>
public static void CutPic(WebBrowser w, int width = 322, int height = 411)
{
Bitmap bitmap = new Bitmap(width, height);
Rectangle rectangle = new Rectangle(0, 0, width, height);
w.DocumentCompleted += (sender, e) => {
// 必须等页面加载完毕后截图才有意义
w.DrawToBitmap(bitmap, rectangle);
// 保存图片
bitmap.Save("c:\\123.jpg");
};
}
private void button_Click(object sender, EventArgs e)
{
// 知识点:属性可以通过这种方式赋值
WebBrowser wb = new WebBrowser {
Url = new Uri("http://www.baidu,com");
};
CutPic(wb);
}