关于C#我今天的六个小时
嘿嘿,今天周六啦,我们是自由学习啦,于是还记得前几天纠结的事情,还有好多不太熟悉的题目那,于是今天就找出来练习下拉,而且这些题目在老师给我们复习时间也给我们讲解过啦,这样一来应该做起来还是容易点的啦,不过却不是我想象中的那样啦,我下午坐在这里做这些题,然后分析下它的思路以及做法和一些方法间的区别,一下整啦六个小时,好出乎意料啦,下面就把我做的这些题整理在这里啦。
一.总结啦一下枚举和结构以及常量的关键字
//常量的关键字const
class Program
{
enum E : short //定义枚举类型里面的参数为short类型的
{
man,
woman
}
enum QQ : long //定义枚举类型里面的参数为long类型的
{
online,
hidden,
busy
}
static void Main(string[] args)
{
A a = new A();
a.x = ;
a.y = ; //结构体可以实例化,通过对象传参 QQ qq = QQ.online; //枚举的方法
E e = E.man; Console.WriteLine("{0},{1}",a.x,a.y);
Console.ReadKey();
}
struct A //结构体,定义一个点的坐标
{
public int x;
public int y;
}
}
其实在复习的课堂上面,老师说的枚举和结构的知识点还记得,但是,今天突然想起来他们之间的区别,就把他们写在啦一起,下次在复习时间可以更好地记得他们各自的用法。虽然结构使用的很少吧,但是还是总结一下啦,嘿嘿。
二.随机数的使用方法
class Program
{
/// <summary>
/// 输出20次1到10之间的随机数
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Random r = new Random();
for (int i = ; i < ; i++)
{
Console.WriteLine(r.Next(, )); //随机数的产生使用的是Random中的Next方法
}
Console.ReadKey();
}
}
在这里,主要是这个方法在刚接触时间真的不能理解他的意思,就是记得它的用法啦,而现在这个已经看起来很熟悉啦,但是这个在使用的地方会多,就简单的写啦一下。
三.字符串的处理
class Program
{
static void Main(string[] args)
{
#region 接收用户输入的一句英文,将其中的单词以反序输出
//课上练习2:“I love you"→“i evol uoy"
//var v = arr.Split(' ');
//foreach (var item in v)
//{
// Console.WriteLine(item);
//}
#endregion #region 合并字符串或者数组Join
//string num = "I love you";
//string arr = " i hate you";
//Console.WriteLine(string.Join(",", num, arr));//可以使用一个连接符
//Console.WriteLine(string.Join("", num, arr));//join方法中可以为空 //string[] ar = { "I love you", "i hate you", "I love you" };
//string num1 = string.Join("*", ar); // 添加分隔符
//Console.WriteLine(num1);
#endregion #region 字符串的合并以及其他转换的方法
//string name = " Tom ";
//string name1 = "Grease";
//Console.WriteLine(string.Concat(name, name1, true));
//Console.WriteLine(name.ToUpper());
//Console.WriteLine(name.ToLower());
//Console.WriteLine(name.Trim());
//Console.WriteLine(name.TrimStart());
//Console.WriteLine(name.TrimEnd());
#endregion #region 字符串的比较
//string name = "Grease";
//string name1 = "Grease";
//if (string.Compare(name, name1, StringComparison.OrdinalIgnoreCase) > 0)
//{
// Console.WriteLine("name大于name1");
//}
//else if (string.Compare(name, name1, StringComparison.OrdinalIgnoreCase) == 0)
//{
// Console.WriteLine("字符串相等");
//}
//else
//{
// Console.WriteLine("name小于name1");
//} #endregion #region Equals
// string name = "Grease";
// string name1 = "Grease";
//// if (name.Equals(name1))
// if (string.Equals(name,name1))
// {
// Console.WriteLine("=");
// }
// else
// {
// Console.WriteLine("!=");
// }
#endregion #region ToCharArray
//string str = "我爱北京天安门,天安门上太阳升";
//char[] s = str.ToArray();
//Console.WriteLine(s[2]);
////char[] a = str.ToCharArray();
//var arr = str.ToCharArray();
//foreach (var item in arr)
//{
// Console.Write(item);
//}
#endregion //字符串为空或者为null.还有就是是否有空格,这三种情况的区别 #region IndexOf
//string word = "旋转音乐盒,下雨天,下雪天! 雪";
//Console.WriteLine(word.IndexOf("下雨天")); //IndexOf输出的是索引
//Console.WriteLine(word.LastIndexOf("音乐盒")); //LastIndexOf从后面开始数数,但是还是该字符正方向的索引
//找不到子字符串返回-1
#endregion #region 方法Substring和Split
//string word = "旋转音乐盒。下雨天,下雪天!雪"; //string a = word.Substring(1); //当方法Substring为一个参数时间则是从此索引街渠道左后
//Console.WriteLine(a); //string b = word.Substring(5, 8);//当为两个参数时间,则为索引,从第一个开始截取到第二个
//Console.WriteLine(b); //string[] c = word.Split(','); //Split方法使用,分割时间是一个字符
//foreach (var item in c)
//{
// Console.WriteLine(item);
//} //string[] d = word.Split(new char[]{',','!','。'}); //可以把多个字符当做分隔符,即用字符数组作为参数
//foreach (var item in d)
//{
// Console.WriteLine(item);
//} #endregion #region Equals与Compare区别
//string num = "Grease";
//string arr = "grease"; //在这里需要注意空格和标点符号都也可以区别是否一样
//Console.WriteLine(string.Equals(num, arr));
//Console.WriteLine(num.Equals(arr, StringComparison.OrdinalIgnoreCase));
////在这里StringComparison.OrdinalIgnoreCase是不区分大小写的方法,区分时间可以不用写这个方法,Equals的结果输入为bool类型真为true,假为false
//Console.WriteLine(string.Compare(num, arr)); //Compare的结果输出为1与0,真为0,假为1
//Console.WriteLine(string.Compare(num, arr, StringComparison.OrdinalIgnoreCase));
#endregion #region Replace
//string name = "ease";
//string name1 = "Grease";
//Console.WriteLine(name.Replace("e", "b").Replace("a", "w")); //Replace可以多项替换
//Console.WriteLine(name1.Replace("e", "b"));
#endregion
Console.ReadKey();
}
}
首先想说的是我再字符串类型转换就是char,string,ToString和ToCharArray之间的转换一直就是迷茫中,但是字符串可以使用的方法就是上面这些,虽然我们不能仅仅依赖于微软给我们提供的方法,但是在我们使用啦这些方法我们的程序真的变得简单好多啦的。
四.集合和装箱拆箱的区别
class Program
{
static void Main(string[] args)
{
//装箱与拆箱
object o= ; //装箱 就是引用类型转换位值类型
int i = (int)o; //拆箱 就是值类型转换为引用类型 #region ArrayList
//string[] strArray = { "下雨天", "旋转音乐盒", "晴天娃娃" };
//ArrayList array = new ArrayList(); //ArrayList是任意类型都可以添加进去
//array.AddRange(strArray); //添加一个数组要用AddRange方法,其他的可以使用Add方法 //array.Add(o); //添加一个object类型的变量
//array.Add("audoeahu"); //添加字符串
//array.Add('a'); //添加字符
//array.Add(4); //添加一个整形的数字 ////array.RemoveAt(1); //移除ArrayList中的其中一项,其中参数为索引值
////array.RemoveRange(2, 3); //移除ArrayList中的其中一项或者几项,其中参数为索引值,从哪个所引导哪个索引
////array.Clear(); //清空ArrayList中的每一项成员
//array.Reverse(); //可以倒叙输出ArrayList中的每一项成员
//#endregion
//foreach (var item in array)
//{
// Console.WriteLine(item);
//}
#endregion #region 泛型List #region int
//List<int> list = new List<int>() {2,5,6,4,5,8,8};
//foreach (var item in list)
//{
// Console.WriteLine(item);
//}
#endregion #region string
//List<string> li = new List<string> {"1","2","3","4","5"};
//string[] arr = li.ToArray();
//foreach (var item in arr)
//{
// Console.WriteLine(item);
//}
#endregion #endregion #region HashTable
Hashtable table = new Hashtable(); table.Add("", "");
table.Add("", "");
table.Add("", ""); foreach (var item in table) //?????????????????????????????
{
Console.WriteLine(item);
}
foreach (var item in table.Keys) //遍历输出Hashtable中的key键的值
{
Console.WriteLine(item);
}
foreach (var item in table.Values) //遍历输出Hashtable中的Values键的值
{ //Hashtable是键值对的形式存放数据以及输出数据的
Console.WriteLine(item);
}
#endregion #region Dictionary
//Dictionary<string, string> d = new Dictionary<string, string>();
//d.Add("旋转音乐盒", "阿悄");
//d.Add("下雨天", "南拳妈妈");
//foreach (var item in d)
//{
// Console.WriteLine(item);
//}
//foreach (var item in d.Keys)
//{
// Console.WriteLine(item);
//}
//foreach (var item in d.Values)
//{
// Console.WriteLine(item);
//}
#endregion Console.ReadKey();
}
}
嘿嘿,上面有一个问题不知道啦,就是在HashTable中不能直接遍历出每一项吗?而Dictionary是可以的,而且Dictionary也可以仅仅遍历出来key值或者Value的值。在集合中其实现在好多使用的是List泛型和Dictionary这两个,似乎是使用ArrayList的现在都使用啦List,使用HashTable的现在好多使用啦Dictionary,所以我们要在掌握List和Dictionary的基础上在学习ArrayList和HashTable啦。
五.对象初始化和对象初始化器的区别
class Product
{
public Product()
{ }
public Product(string name, double price, DateTime time, double code)
{
this.Productname = name;
this.Productprice = price;
this.Producttime = time;
this.Productcode = code;
}
public string productname; public string Productname
{
get { return productname; }
set { productname = value; }
}
private double productprice; public double Productprice
{
get { return productprice; }
set { productprice = value; }
}
private DateTime producttime; public DateTime Producttime
{
get { return producttime; }
set { producttime = value; }
}
private double productcode; public double Productcode
{
get { return productcode; }
set { productcode = value; }
}
internal void ShowProductInfomation()
{
Console.WriteLine("商品名称{0},商品价格{1},出产合格日期{2},商品条码{3}", this.Productname, this.Productprice, this.producttime, this.Productcode);
}
}
class footproduct:Product
{
public void SayFoodInfomation()
{
Console.WriteLine("{0},{1},{2},{3}", base.Productname, base.Productcode, base.Productprice, base.Producttime);
}
}
class Program
{
static void Main(string[] args)
{
#region 初始化对象
//Product p = new Product("旺旺大礼包", 11.22, DateTime.Now.AddMonths(-18), 11.2233); //初始化对象、即实例化
//p.ShowProductInfomation();
//Console.WriteLine(p.productname);
//Console.ReadKey();
#endregion #region 对象初始化器
Product p1 = new Product { Productname = "旺旺大礼包", Productprice = 11.22, Producttime = DateTime.Now.AddMonths(-), Productcode = 11.2233 };//对象初始化器;
Console.WriteLine(p1.Productname);
Console.WriteLine(p1.Productprice);
Console.WriteLine(p1.Producttime);
Console.WriteLine(p1.Productcode);
Console.ReadKey();
#endregion
}
}
在这里,对象的初始化与对象的初始化器容易混淆,于是在这里区别一下,帮助自己的记忆。
六.FileStream的用法
class Program
{
static void Main(string[] args)
{
#region FileStream读文件
//using (FileStream fs = File.Open(@"F:\resoult.txt", FileMode.OpenOrCreate, FileAccess.Read)) //打开文件,找到到文件的位置
//{
// byte[] bytes = new byte[200]; //定义文件每次读取的量
// int num = fs.Read(bytes, 0, bytes.Length); //读取字节块
// string resoult = Encoding.Default.GetString(bytes, 0, bytes.Length); //以ANSI编码的方式读取
// Console.WriteLine(resoult);
//}
#endregion #region FileStream读写文件
//int i = 0;
//using (FileStream file = File.Open(@"F:\\第二周考试.rar", FileMode.OpenOrCreate, FileAccess.Read))
//{
// Byte[] bytes = new byte[10];
// using (FileStream f = File.Open(@"E:\\第二周考试.rar", FileMode.OpenOrCreate, FileAccess.Write))
// {
// if(file.Read(bytes, 0, bytes.Length) > 0)
// {
// f.Write(bytes,0,bytes.Length);
// i++;
// Console.WriteLine(i);
// }
// }
//}
Console.ReadKey();
#endregion
}
}
这个其实就是读取文件的方法啦。嘿嘿
七.Ditectory的用法
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
string num = this.comboBox1.SelectedItem.ToString();
this.pictureBox1.Image = Image.FromFile(@"F:\/练习项目\/11月27日\/01radiocheckbox\/img" + num + ".jpg");
} private void Form1_Load(object sender, EventArgs e)
{
string[] image = Directory.GetFiles(@"F:\/练习项目\/11月27日\/01radiocheckbox\/img");
string[] file = new string[image.Length];
for (int i = ; i < image.Length; i++)
{
string path = Path.GetFileNameWithoutExtension(image[i]);
file[i] = path;
}
comboBox1.Items.AddRange(file);
}
在这里使用的Directory是在winform中使用的,再窗体上面拖拉两个控件分别为PictureBox和Button,然后实现其各自属性和事件即可。
八.StringBuild的用法
class Program
{
static void Main(string[] args)
{
StringBuilder builder = new StringBuilder(); //StringBuilder需要初始化,通过对象添加参数 #region StringBuilder的方法
//builder.Append("下雨天");
//builder.Append("旋转音乐盒"); // Append事件为添加 //builder.AppendLine("下雨天"); // Append事件为添加之后换行
//builder.AppendLine("旋转音乐盒");
//builder.AppendLine("晴天娃娃"); //builder.Insert(3," 演唱:南拳妈妈 ");
//builder.Insert(21, " 演唱:阿悄 "); //builder.Replace('演','主');
////builder.Replace(); //在这里replace的方法参数仅仅为char类型 //builder.Remove(0, 2); //Remove在这里为把索引值为0到索引值为2的这段文字清除
////builder.Clear(); //全部清空
#endregion //builder.AppendLine("<html>"); //StringBuilder的可以显示静态页的样式,而且不需要遍历输出,仅仅需要输出对象即可
//builder.AppendLine(" <head>");
//builder.AppendLine(" <title>网页</title>");
//builder.AppendLine(" </head>");
//builder.AppendLine(" <body>");
//builder.AppendLine(" <p>StringBuilder做的HTML代码");
//builder.AppendLine(" </p>");
//builder.AppendLine(" </body>");
//builder.AppendLine("</html>");
Console.WriteLine(builder);
Console.ReadKey();
}
}
StringBuilder其实用法应该和String比较一下那。但是我们在开始学习就一直使用String,而且我前面也详细的把定义以及那一个更好写过啦,所以就只说下StringBuilder的更多方法以及需要注意的啦。
九.StreamReader和StreamWriter的学习
class Program
{
static void Main(string[] args)
{
//StreamReader的用法,读取文件内容
using (StreamReader reader = new StreamReader(@"F:\\1.txt"))
{
while (reader.Read() > )
{
Console.WriteLine(reader.ReadLine());
}
} string num = "abcabcabcabcabcabcabcabc";
using (StreamWriter str = new StreamWriter("1.txt"))
{
str.WriteLine(num); //在这里StreamWriter的参数应该怎么整??????????????
}
Console.ReadKey();
}
}
StringReader和StringWriter在这里就是读取和写入文件,这里是和电脑上存放的文息息相关的啦。
十.Path的用法
class Program
{
static void Main(string[] args)
{
//string strPath = @"D:\\r\\1.txt";
//Console.WriteLine(Path.GetExtension(strPath)); //获取字符串文件扩展名
//Console.WriteLine(Path.GetFileName(strPath)); //获取字符串文件名字
//Console.WriteLine(Path.GetFileNameWithoutExtension(strPath)); //获取字符串文件不带扩展名的名字
//Console.WriteLine(Path.GetFullPath(strPath)); //获取字符串文件的全部路径
//Console.WriteLine(Path.GetPathRoot(strPath)); //获取字符串文件的根目录
//Console.WriteLine(Path.GetDirectoryName(strPath)); //获取字符串文件的目录信息,不包含自己的字符串文件名字 //Console.WriteLine(Path.ChangeExtension(strPath,"mp3")); //改变字符串路径的扩展名 //string str = @"F:\\"; //必须以两个\\开头
//string str1 = @"1.txt";
//Console.WriteLine(Path.Combine(str,str1)); //合并字符串路径
Console.ReadKey();
}
}
Path主要是针对字符串进行处理的,文件是虚拟的存在,这个要区分开的啦。
十一.文件File操作
class Program
{
static void Main(string[] args)
{
//文件的创建 读取 复制 移动 删除
//string path = @"E:\a.mp3";
//File.Create(path); //创建文件 //File.CreateText(@"E:\a.txt"); //创建文本文件 //////////////////string text = File.ReadAllText(@"E:\a.txt", Encoding.Default); //读取
//////////////////File.AppendAllText(@"F:练习项目", text, Encoding.Default); //参数怎么写?
//将指定的字符串添加到文件中,如果文件不存在,则可以自动创建 //File.Copy(@"E:\a.txt", @"F:\b.txt", true); //复制 //string a=@"E:\a.txt";
//string b = @"F:\a.txt";
//File.Move(a, b); //移动
//File.Delete(b); //删除 //Console.WriteLine(File.Exists(@"D:\111.avi")); //Exists方法是确定指定的文件是否存在,返回一个bool类型的值 ////////////////////byte[] bytes = File.ReadAllBytes(@"E:\a.txt"); //ReadAllBytes怎么用?
////////////////////string a=Encoding.Default.GetString(bytes);
////////////////////Console.WriteLine(a); //Console.WriteLine(File.GetCreationTime(@"F:\练习项目")); //获取文件的创建时间
//Console.WriteLine(File.GetLastAccessTimeUtc(@"F:\练习项目"));//获取上次访问文件文件的时间
Console.WriteLine("ok");
Console.ReadKey();
}
}
这个也是针对计算机英翻上存放的文件进行处理,而他的AppendAllText方法的参数在vs中有显示,不知道为什么没能写出来啦,回头拉问问再补充上来啦。
十二. 委托Delegate
delegate string Print(string name, string sex); //创建一个有返回值的委托
class Program
{
static void Main(string[] args)
{
Print p = new Print(SayHi); //委托的调用 第一种 参数为一个方法
p += SayHello; Print p1 = delegate(string name, string s) //第二种
{
return name + s;
}; Print p2 = (string name, string sex) => name + sex; //第三种 Print p3 = (name, address) => name + address; //第四种,同时这也是拉姆达表达式的形成过程 Console.WriteLine(p("笑笑", "男")); //为对象添加参数的值
Console.ReadKey();
}
static string SayHi(string name, string sex)
{
return name + sex;
}
static string SayHello(string name, string sex)
{
return name + sex;
}
}
在这里委托刚开始学习都有点晕啦,其实就是在Main函数传参时间委托实例化对象时间传进来一个方法作为参数。
十三.事件Event
delegate void Bark(); //定义一个委托
class Program
{
static void Main(string[] args)
{
Cat c = new Cat();
c.Name = "大脸猫"; Mouse m = new Mouse();
m.Name = "蓝皮鼠"; c.Running += m.MouBark;
/*在CatBark方法被实例化调用时间,事件Running被触发,
则调用MouBark,这样就是事件的实现过程*/
c.CatBark();
Console.ReadKey();
}
}
class Cat
{
string name;
public string Name
{
get { return name; }
set { name = value; }
}
public event Bark Running; //事件是建立在委托之上的,这里是建立一个事件
public void CatBark()
{
Console.WriteLine("Hi,{0}来啦",Name);
if (Running != null)
{
Running();
}
}
}
class Mouse
{
string name; public string Name
{
get { return name; }
set { name = value; }
}
public void MouBark()
{
Console.WriteLine("{0}快跑", Name);
}
}
当事件的发生一定会伴随着委托的实现,这个事件其实在winform中,我们对按钮等事件的单击事件就是事件中的一种啦,他需要调用委托。
今天的总结就到这里啦,虽然是有点多啦,但是向系统的把一下学过的知识系统化啦,这样也可以帮助我们更好的记忆啦,嘿嘿。
关于C#我今天的六个小时的更多相关文章
- 转 对菜鸟开发者的叮咛:花一万个小时练习Coding,不要浪费一万小时无谓地Debugging
原文见http://blog.jobbole.com/74825/ Coding 之于科技的重要性不言可喻,也不再是软体工程师的专利,医师.律师.会计师.护理师.金融从业人员,甚至是听起来摸不着边的政 ...
- 【hexo】如何在一个小时内搭载个人博客
版权申明:本文为博主原创文章,未经博主允许不得转载.如需转载,请私聊博主. 什么是hexo Hexo是一个开源的静态博客生成器,用node.js开发,作者是台湾大学生tommy351. 前期准备 安装 ...
- 如何在Windows上从源码编译Chromium (CEF3) 加入mp3支持
一.什么是CEF CEF即Chromium Embeded Framework,由谷歌的开源浏览器项目Chromium扩展而来,可方便地嵌入其它程序中以得到浏览器功能. CEF包括CEF1和CEF3两 ...
- 减小ipa体积之删除frameWork中无用mach-O文件
最近项目末期, 我们团队为了ipa的大小使用不少的体积减小的方法, 除了一些常规的方法之外, 我分享一下自己研究出来的新思路. 首先我们来简单的介绍一下mach-O. 什么是mach-O? Mach- ...
- Nodejs之MEAN栈开发(三)---- 使用Mongoose创建模型及API
继续开扒我们的MEAN栈开发之路,前面两节我们学习了Express.Jade引擎并创建了几个静态页面,最后通过Heroku部署了应用. Nodejs之MEAN栈开发(一)---- 路由与控制器 Nod ...
- 玩蛇记--Python处理海量手机号码
一.任务描述 上周,老板给我一个小任务:批量生成手机号码并去重.给了我一个Excel表,里面是中国移动各个地区的可用手机号码前7位(如下图),里面有十三张表,每个表里的电话号码前缀估计大概是八千个,需 ...
- 现在开始(Do It Now)
现在开始(Do It Now) 很多年前读大学的时候,我决定制定一个计划挑战自己:只用三个学期完成其他人通常花费四年的课程,能否毕业.这篇文章(此文为翻译)详细的说明了我在成功实现该目标过程中的所有时 ...
- 使用bokeh-scala进行数据可视化
目录 前言 bokeh简介及胡扯 bokeh-scala基本代码 我的封装 总结 一.前言 最近在使用spark集群以及geotrellis框架(相关文章见http://www.cnbl ...
- 国内第一篇详细讲解hadoop2的automatic HA+Federation+Yarn配置的教程
前言 hadoop是分布式系统,运行在linux之上,配置起来相对复杂.对于hadoop1,很多同学就因为不能搭建正确的运行环境,导致学习兴趣锐减.不过,我有免费的学习视频下载,请点击这里. hado ...
随机推荐
- VBA学习笔记(3)--文件夹操作
说明(2017.3.22): 1. 根据兰色幻想VBA80集视频教学,总结 2. 大部分可以用自带函数处理,不过复制文件夹需要用到FileSystemObject对象,打开文件夹用到shell Pub ...
- phpexcel导出乱码
在输出到浏览器时,要在head前加ob_end_clean();参考此文, ob_end_clean(); header('Content-Type: application/vnd.ms-excel ...
- C语言 · 三个整数的排序
算法提高 三个整数的排序 时间限制:1.0s 内存限制:256.0MB 问题描述 输入三个数,比较其大小,并从大到小输出. 输入格式 一行三个整数. 输出格式 一行三个整数,从大到小 ...
- am335x PDK3.0 设置为单网口配置记录
原来的配置是双网口的,现在要配置为单网口. 一直以为这个配置是在 make menuconfig 里面, 没想到是在设备树里面. 修改设备树 // vim arch/arm/boot/dts/am33 ...
- contiki 无线测试 1个中心节点 13个从节点
1 DATA recv '25.00 degres' from 2423:7c02:5525:4f2b2 DATA recv '27.71 degres' from 24f7:af03:5525:4f ...
- phalcon遇到的那些坑
1.数据重复插入 数据被重复插入,一般是在index/index方法中进行数据库insert操作,会发现一条数据被重复插了一次. 原因:浏览器有时候会自动请求 /favicon.ico ,而你的网站并 ...
- 上手并过渡到PHP7(5)——轻量级“集合”迭代器-Generator
轻量级“集合”迭代器-Generator泊学视频链接泊阅文档链接Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Gener ...
- CSS边框-属性详解
图解CSS padding.margin.border属性 W3C组织建议把所有网页上的对像都放在一个盒(box)中,设计师可以通过创建定义来控制这个盒的属性,这些对像包括段落.列表.标题.图片以及层 ...
- 写给测试人员:不是所有的bug都需要修复
用户往往对产品中各种各样的bug抱怨不已,而测试人员往往认为自己的职责就是揪出这些所有的bug并把它们全都修复.然而,这是一个误区.微软卓越测试工程总监Alan Page近日撰文,再次解释了有哪些bu ...
- C struct的内存对齐
说明:如果你看到了这篇,请略过. struct是复合类型. 其中的成员在内存中的分布都是对齐的. 这个对齐的意思是,struct的sizeof运算结果必定是其最大类型长度的整数倍. --注意,如果st ...