Cookie使用时需要注意个数及大小限制

各浏览器对Cookie有一定的限制,在使用时需要格外注意。

各浏览器之间对cookie的不同限制:

  IE6.0 IE7.0/8.0/9.0+ Opera FF Safari Chrome
cookie个数   每个域为20个    每个域为50个   每个域为30个   每个域为50个    没有个数限制    每个域为53个
cookie大小 4095个字节 4095个字节 4096个字节 4097个字节 4097个字节 4097个字节
总之,在进行页面cookie操作的时候,应该尽量保证cookie个数小于20个,总大小 小于4KB

C# 中Linq查询所有上级节点或所有下级节点

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApp7
{
    class Program
    {
        static void Main(string[] args)
        {
 
            var data = GetData();
 
            //获取所有下级
            //var query = GetSons(data, 1);
 
            //获取所有上级
            var query = GetFatherList(data, 5);
            Console.WriteLine("Id\t 区划\t 父ID\t 层级\t");
            query.ToList().ForEach(q => Console.WriteLine("{0}\t {1}\t {2}\t {3}\t", q.Id, q.Name, q.Fid, q.Level));
 
            Console.ReadLine();
        }
 
        #region 测试数据
        public static IList<menu> GetData()
        {
            var list = new List<menu>();
            list.Add(new menu { Id = 1, Name = "广东省", Fid = 0, Level = 1 });
            list.Add(new menu { Id = 2, Name = "深圳市", Fid = 1, Level = 2 });
            list.Add(new menu { Id = 3, Name = "南山区", Fid = 2, Level = 3 });
            list.Add(new menu { Id = 4, Name = "福田区", Fid = 2, Level = 3 });
            list.Add(new menu { Id = 5, Name = "上梅林", Fid = 4, Level = 4 });
            list.Add(new menu { Id = 6, Name = "下梅林", Fid = 4, Level = 4 });
            list.Add(new menu { Id = 7, Name = "车公庙", Fid = 4, Level = 4 });
            list.Add(new menu { Id = 8, Name = "蛇口", Fid = 5, Level = 4 });
            list.Add(new menu { Id = 9, Name = "科技园", Fid = 5, Level = 4 });
            list.Add(new menu { Id = 10, Name = "湖南省", Fid = 0, Level = 1 });
            list.Add(new menu { Id = 11, Name = "长沙市", Fid = 10, Level = 2 });
            list.Add(new menu { Id = 12, Name = "芙蓉区", Fid = 11, Level = 3 });
            return list;
        }
        #endregion
 
        #region 获取所有下级
        public static IEnumerable<menu> GetSons(IList<menu> list, int Fid)
        {
            var query = list.Where(p => p.Id == Fid).ToList();
            var list2 = query.Concat(GetSonList(list, Fid));
            return list2;
        }
 
        public static IEnumerable<menu> GetSonList(IList<menu> list, int Fid)
        {
            var query = list.Where(p => p.Fid == Fid).ToList();
            return query.ToList().Concat(query.ToList().SelectMany(t => GetSonList(list, t.Id)));
        }
        #endregion
 
        #region 获取所有上级
        public static IEnumerable<menu> GetFatherList(IList<menu> list, int Id)
        {
            var query = list.Where(p => p.Id == Id).ToList();
            return query.ToList().Concat(query.ToList().SelectMany(t => GetFatherList(list, t.Fid)));
        }
        #endregion
 
        #region 实体类
        public class menu
        {
            public int Id { set; get; }
            public string Name { set; get; }
            public int Fid { set; get; }
            public int Level { set; get; }
        }
        #endregion
    }
}

 

C#代码将html样式文件转为Word文档

首先有个这样的需求,将以下网页内容下载为Word文件。

html代码:

<div class="modal-body">
    <div style="height:600px;width:550px; margin:0 auto;">
        <table style="border-collapse:separate;border-spacing:10px;width: 100%">
            <tr>
                <td style="text-align: center;font-size: 30px;font-weight: bold">中标通知书<hr /></td>
            </tr>
            <tr>
                <td style="text-align: left;font-size:20px;">XX</td>
            </tr>
            <tr>
                <td style="text-align: left"> “XXXX物资平台”ZY1703220001号标的开标结果为贵方中标,现通知如下:</td>
            </tr>
        </table>
        <table border="1" cellspacing="0" cellpadding="10" style="border-collapse:separate;height: 300px;">
            <tr style="text-align:center;">
                <th>品名</th>
                <th>资源编号</th>
                <th>数量(吨)</th>
                <th>中标价格(含税总金额:元)</th>
                <th>钢厂</th>
                <th>存放地(提货地)</th>
            </tr>
            <tr style="text-align:center;">
                <td>冷轧窄带</td>
                <td>ZY1703220001</td>
                <td>25.725</td>
                <td>47500.00</td>
                <td>XX</td>
                <td>XXXXXX</td>
            </tr>
            <tr>
                <td colspan="6">备注:XXXXXX</td>
            </tr>
        </table>
        <table style="border-collapse:separate;border-spacing:10px;width: 100%">
            <tr>
                <td style="text-align: left">
                    请贵方在收到通知书的5个工作日内交齐全额货款并签订合同。
                </td>
            </tr>
            <tr>
                <td style="text-align: left">
                    特此通知。
                </td>
            </tr>
            <tr>
                <td style="text-align: right">
                    XXXX物资平台
                </td>
            </tr>
            <tr>
                <td style="text-align:right">
                    2017 年 4月 16 日
                </td>
            </tr>
        </table>

    </div>
</div>

 

样式展示:

第一步:封装一个方法

1:在控制器BiddingNoticeManageController创建一个DownBiddingNoticeModal方法。(采用的MVC模式)

2:根据id查询当前中标信息(EF)

3:建一个中标通知书的html模板页(数据字段自定义占位符)

  3-1:注:html模板中不需要<html>、<head>、<title>、<body>等标签。只是单纯的div布局标签

  3-2:布局标签中的样式必须是内联,就是写在标签中,不能写在外部.css中。

4:通过Stream、StreamReader两个类来读取这个模板文件(返回的是html字符串)。

5:2中查询出数据(对应字段)替换4中返回的html字符串中的占位符。

6:关键代码

    StringBuilder sb = new StringBuilder();
            sb.Append(
                "<html xmlns:v=\"urn:schemas-microsoft-com:vml\"  xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:w=\"urn:schemas-microsoft-com:office:word\" xmlns:m=\"http://schemas.microsoft.com/office/2004/12/omml\"xmlns = \"http://www.w3.org/TR/REC-html40\">");
            sb.Append(html);
            sb.Append("</html>");

7:用法:在页面前端写一个a标签指向这个方法即可下载为Word文件了。

HTML模板文件:

<div class="modal-body">
    <div style="height:600px;width:550px; margin:0 auto;">
        <table style="border-collapse:separate;border-spacing:10px;width: 100%">
            <tr>
                <td style="text-align: center;font-size: 30px;font-weight: bold">中标通知书<hr /></td>
            </tr>
            <tr>
                <td style="text-align: left;font-size:20px;">@BidderName</td>
            </tr>
            <tr>
                <td style="text-align: left"> “XXXX物资平台”@ResourceCode号标的开标结果为贵方中标,现通知如下:</td>
            </tr>
        </table>
        <table border="1" cellspacing="0" cellpadding="10" style="border-collapse:separate;height: 300px;">
            <tr style="text-align:center;">
                <th>品名</th>
                <th>资源编号</th>
                <th>数量(@Unit)</th>
                <th>中标价格(含税总金额:元)</th>
                <th>钢厂</th>
                <th>存放地(提货地)</th>
            </tr>
            <tr style="text-align:center;">
                <td>@ResourceName</td>
                <td>@ResourceCode</td>
                <td>@Count</td>
                <td>@TenderPrice</td>
                <td>@BrandName</td>
                <td>@InventoryPlace</td>
            </tr>
            <tr>
                <td colspan="6">备注:@Remarks</td>
            </tr>
        </table>
        <table style="border-collapse:separate;border-spacing:10px;width: 100%">
            <tr>
                <td style="text-align: left">
                    请贵方在收到通知书的5个工作日内交齐全额货款并签订合同。
                </td>
            </tr>
            <tr>
                <td style="text-align: left">
                    特此通知。
                </td>
            </tr>
            <tr>
                <td style="text-align: right">
                    XXXX物资平台
                </td>
            </tr>
            <tr>
                <td style="text-align:right">
                    @Year 年 @Moth 月 @Day 日
                </td>
            </tr>
        </table>

    </div>
</div>

 

       /// <summary>
        /// 下载中标通知书
        /// 用法:前端一个a标签指向这个控制器的这个方法
        /// </summary>
        /// <param name="id">中标通知书Id</param>
        [AbpMvcAuthorize(BiddingNoticeAppPermissions.BiddingNotice)]

        public ActionResult DownBiddingNoticeModal(long id)
        {
            #region 读取模板 
            var html = GetBidTempStrng();
            #endregion

            #region 根据ID读取中标内容 替换数据
            var model = _biddingNoticeRepository.FirstOrDefault(id);
            if (model != null)
            {
                html = html.Replace("@BrandName", model.BrandName).Replace("@ResourceCode", model.ResourceCode)
                    .Replace("@ResourceName", model.ResourceName).Replace("@Count", model.Count.ToString())
                    .Replace("@TenderPrice", model.TenderPrice.ToString()).Replace("@BidderName", model.BidderName)
                    .Replace("@InventoryPlace", model.InventoryPlace).Replace("@Remarks", model.Remarks)
                    .Replace("@Year", model.CreationTime.Year.ToString()).Replace("@Moth", model.CreationTime.Month.ToString())
                    .Replace("@Day", model.CreationTime.Day.ToString()).Replace("@Unit", model.Unit);
            }
            else
            {
                html = html.Replace("@BrandName", "XXXXX").Replace("@ResourceCode", "ZYXXXXXXXX")
                    .Replace("@ResourceName", "XXXXX").Replace("@Count", "0")
                    .Replace("@TenderPrice", "0").Replace("@BidderName", "XXXXX")
                    .Replace("@InventoryPlace", "XXXXX").Replace("@Remarks", "XXXXXXXX")
                    .Replace("@Year", "XXXX").Replace("@Moth", "XX")
                    .Replace("@Day", "XX").Replace("@Unit", "X");
            }
            #endregion

            #region 转换为Word文档样式

            StringBuilder sb = new StringBuilder();
            sb.Append(
                "<html xmlns:v=\"urn:schemas-microsoft-com:vml\"  xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:w=\"urn:schemas-microsoft-com:office:word\" xmlns:m=\"http://schemas.microsoft.com/office/2004/12/omml\"xmlns = \"http://www.w3.org/TR/REC-html40\">");
            sb.Append(html);
            sb.Append("</html>");
            return File(Encoding.UTF8.GetBytes(sb.ToString()), "application/msword", $"中标通知书.doc");

            #endregion
        }

        /// <summary>
        /// 读取中标通知书模板
        /// </summary>
        /// <returns></returns>
        private string GetBidTempStrng()
        {
            StringBuilder sbHtml = new StringBuilder();
            // 读取模板替换数据
            var path = Server.MapPath("~/Common/BidTemplace/BidTemp.html");
            using (Stream inStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read))
            using (StreamReader outStream = new StreamReader(inStream, Encoding.Default))
            {
                while (!outStream.EndOfStream)
                {
                    sbHtml.Append(outStream.ReadLine());
                }
            }
            var html = sbHtml.ToString();
            return html;
        }

C#获取域名[/虚拟目录] 及物理目录

using System;  
using System.Web;  
  
namespace RTXEX.Common  
{  
    /// <summary>  
    /// 全局类,获取当前域名、物理路径  
    /// </summary>  
    public class WebApplication  
    {  
        static string _appUrl = null;  
        static string _appSiteName = null;  
        static string _appMapPath = null;  
  
        /// <summary>  
        /// 获得url路径, http://localhost/aa/index.aspx 的app部分如:http://localhost/aa  
        /// </summary>  
        public static string AppUrl  
        {  
            get  
            {  
                //return "http://" + System.Web.HttpContext.Current.Request.Url.Host + AppSiteName;  
                if (_appUrl == null)  
                    _appUrl = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + AppSiteName;  
  
                return _appUrl;  
            }  
        }  
  
        /// <summary>  
        /// 获得 http://localhost/aa/index.aspx 的 虚拟应用名部分如:aa  
        /// </summary>  
        public static string AppSiteName  
        {  
            get  
            {  
                if (_appSiteName == null)  
                    _appSiteName = HttpContext.Current.Request.ApplicationPath.Equals("/") ? string.Empty : HttpContext.Current.Request.ApplicationPath;  
  
                return _appSiteName;  
            }  
        }  
  
        /// <summary>  
        /// 获得 http://localhost/aa/index.aspx 的物理路径 如:D:\work\vsProject\MvcApplication1  
        /// </summary>  
        public static string AppMapPath  
        {  
            get  
            {  
                if (_appMapPath == null)  
                {  
                    _appMapPath = HttpContext.Current.Server.MapPath("~");  
                    _appMapPath = _appMapPath.EndsWith("\\") ? _appMapPath.Remove(_appMapPath.Length - 1) : _appMapPath;  
                }  
  
                return _appMapPath;  
            }  
        }  
  
    }  
}  

 

ASP.NET应用程序中Server.MapPath("."),Server.MapPath("~"),Server.MapPath(@"\")的区别

the-differences-between-server-mappath-server-mappath

在看文章前,你是否能够说以下四个Server.MapPath方法取出来的路径分别是什么吗?

  • Server.MapPath(".")
  • Server.MapPath("~")
  • Server.MapPath(@"\")
  • Server.MapPath("/")

在弄清楚这四个路径之前,我们先前熟悉一下:什么是Server.MapPath? Server.MapPath是ASP.NET[C#]开发框架中用于将指定相对或者虚拟路径转换为对应物理目录的一个内部方法,Server.MapPath方法根据参数不同,会返回不同的物理路径,如上面四个参数:

  • Server.MapPath("."):返回当前访问文件的物理路径;
  • Server.MapPath(".."):返回父目录;
  • Server.MapPath("~"):返回当前应用程序的物理路径的根目录,如果是根目录,就是根目录,如果是虚拟目录,就是虚拟目录所在的位置;
  • Server.MapPath("/"):返回当前域名的物理路径的根目录

比如:假设您指定了一个网站应用程序:http://www.example.com/,物理磁盘的位置在:

C:\Inetpub\wwwroot

并且安装了一个商店应用程序(子网站作为IIS中的虚拟目录,并标记为应用程序)

D:\WebApps\shop

现在,比如有如下的访问请求:

http://www.example.com/shop/products/GetProduct.aspx?id=2342

我们使用Server.MapPath()方法:

  • Server.MapPath(".") 返回 D:\WebApps\shop\products
  • Server.MapPath("..") 返回 D:\WebApps\shop
  • Server.MapPath("~") 返回 D:\WebApps\shop
  • Server.MapPath("/") 返回 C:\Inetpub\wwwroot
  • Server.MapPath("/shop") 返回 D:\WebApps\shop

极简bootstrap file 美化样式(无需第三方插件)

原本的file上传表单非常的丑,但是又不想使用第三方插件,Bootstrap也没有相关的美化,于是用纯CSS完成,美化,JS实现功能,连BootStrap都不需要,十分简单

1.给原版丑表单隐藏了display:none

 
<!-- 真正的文件上传表单 -->
 <input name="realFile" type="file" id="thisfile" style="display: none" /> 
     
 <div class="input-append">  
       <!-- 用于展示上传文件名的表单 -->
       <input id="showname" class="input-large" type="text" style="height:25px;">  
        <!-- 点击触发按钮 -->
        <a class="btn" onclick="makeThisfile()" id="browse">浏览</a>  
 </div>
#browse{
    order: 1px solid #ccc;
    padding: 4px;
    border-radius: 4px;
    background-color: #2c9a8a;
    color: #fff;
}
3.js代码,它在点击假表单的时候触发真表单,弹出文件筐,当选择时,又将真表单的文件名载入到展示框
<script type="text/javascript">
 //触发隐藏的file表单
 function makeThisfile(){
        $('#thisfile').click();
  }
 
   //file表单选中文件时,让file表单的val展示到showname这个展示框
  $('#thisfile').change(function(){
        $('#showname').val($(this).val())
    })
</script>

走进异步编程的世界 - 开始接触 async/await

  这是学习异步编程的入门篇。

  涉及 C# 5.0 引入的 async/await,但在控制台输出示例时经常会采用 C# 6.0 的 $"" 来拼接字符串,相当于string.Format() 方法。

 目录

  • What's 异步?
  • async/await 结构
  • What’s 异步方法? 

一、What's 异步?

     启动程序时,系统会在内存中创建一个新的进程。进程是构成运行程序资源的集合。
     在进程内部,有称为线程的内核对象,它代表的是真正的执行程序。系统会在 Main 方法的第一行语句就开始线程的执行。
 
     线程:
     ①默认情况,一个进程只包含一个线程,从程序的开始到执行结束;
     ②线程可以派生自其它线程,所以一个进程可以包含不同状态的多个线程,来执行程序的不同部分;
     ③一个进程中的多个线程,将共享该进程的资源;
     ④系统为处理器执行所规划的单元是线程,而非进程。
 
     一般来说我们写的控制台程序都只使用了一个线程,从第一条语句按顺序执行到最后一条。但在很多的情况下,这种简单的模型会在性能或用户体验上不好。
     例如:服务器要同时处理来自多个客户端程序的请求,又要等待数据库和其它设备的响应,这将严重影响性能。程序不应该将时间浪费在响应上,而要在等待的同时执行其它任务!
     现在我们开始进入异步编程。在异步程序中,代码不需要按照编写时的顺序执行。这时我们需要用到 C# 5.0 引入的 async/await 来构建异步方法。
 
     我们先看一下不用异步的示例:
class Program
    {
        //创建计时器
        private static readonly Stopwatch Watch = new Stopwatch();

        private static void Main(string[] args)
        {
            //启动计时器
            Watch.Start();

            const string url1 = "http://www.cnblogs.com/";
            const string url2 = "http://www.cnblogs.com/liqingwen/";

            //两次调用 CountCharacters 方法(下载某网站内容,并统计字符的个数)
            var result1 = CountCharacters(1, url1);
            var result2 = CountCharacters(2, url2);

            //三次调用 ExtraOperation 方法(主要是通过拼接字符串达到耗时操作)
            for (var i = 0; i < 3; i++)
            {
                ExtraOperation(i + 1);
            }

            //控制台输出
            Console.WriteLine($"{url1} 的字符个数:{result1}");
            Console.WriteLine($"{url2} 的字符个数:{result2}");

            Console.Read();
        }

        /// <summary>
        /// 统计字符个数
        /// </summary>
        /// <param name="id"></param>
        /// <param name="address"></param>
        /// <returns></returns>
        private static int CountCharacters(int id, string address)
        {
            var wc = new WebClient();
            Console.WriteLine($"开始调用 id = {id}:{Watch.ElapsedMilliseconds} ms");

            var result = wc.DownloadString(address);
            Console.WriteLine($"调用完成 id = {id}:{Watch.ElapsedMilliseconds} ms");

            return result.Length;
        }

        /// <summary>
        /// 额外操作
        /// </summary>
        /// <param name="id"></param>
        private static void ExtraOperation(int id)
        {
            //这里是通过拼接字符串进行一些相对耗时的操作
            var s = "";

            for (var i = 0; i < 6000; i++)
            {
                s += i;
            }

            Console.WriteLine($"id = {id} 的 ExtraOperation 方法完成:{Watch.ElapsedMilliseconds} ms");
        }
    }
 
 

【备注】一般来说,直接拼接字符串是一种比较耗性能的手段,如果对字符串拼接有性能要求的话应该使用 StringBuilder。
  【注意】每次运行的结果可能不同。不管哪次调试,绝大部分时间都浪费前两次调用(CountCharacters 方法),即在等待网站的响应上。
 有人曾幻想着这样提高性能的方法:在调用 A 方法时,不等它执行完,直接执行 B 方法,然后等 A 方法执行完成再处理。
     C# 的 async/await 就可以允许我们这么弄。
 我们观察时间轴发现,新版代码比旧版快了不少(由于网络波动的原因,很可能会出现耗时比之前长的情况)。这是由于 ExtraOperation 方法的数次调用是在 CountCharactersAsync 方法调用时等待响应的过程中进行的。所有的工作都是在主线程中完成的,没有创建新的线程。
 
  【改动分析】只改了几个细节的地方,直接展开代码的话可能看不出来,改动如下:

①从 Main 方法执行到 CountCharactersAsync(1, url1) 方法时,该方法会立即返回,然后才会调用它内部的方法开始下载内容。该方法返回的是一个 Task<int> 类型的占位符对象,表示计划进行的工作。这个占位符最终会返回 int 类型的值。

  ②这样就可以不必等 CountCharactersAsync(1, url1) 方法执行完成就可以继续进行下一步操作。到执行 CountCharactersAsync(2, url2)  方法时,跟 ① 一样返回 Task<int> 对象。

  ③然后,Main 方法继续执行三次 ExtraOperation 方法,同时两次 CountCharactersAsync 方法依然在持续工作 。

  ④t1.Result 和 t2.Result 是指从 CountCharactersAsync 方法调用的 Task<int> 对象取结果,如果还没有结果的话,将阻塞,直有结果返回为止。

 

二、async/await 结构

     先解析一下专业名词:
     同步方法:一个程序调用某个方法,等到其执行完成之后才进行下一步操作。这也是默认的形式。
     异步方法:一个程序调用某个方法,在处理完成之前就返回该方法。通过 async/await 我们就可以实现这种类型的方法。
 
     async/await 结构可分成三部分:
     (1)调用方法:该方法调用异步方法,然后在异步方法执行其任务的时候继续执行;
     (2)异步方法:该方法异步执行工作,然后立刻返回到调用方法;
     (3)await 表达式:用于异步方法内部,指出需要异步执行的任务。一个异步方法可以包含多个 await 表达式(不存在 await 表达式的话 IDE 会发出警告)。
 
  现在我们来分析一下示例。

 三、What’s 异步方法

     异步方法:在执行完成前立即返回调用方法,在调用方法继续执行的过程中完成任务。
     语法分析:
     (1)关键字:方法头使用 async 修饰。
     (2)要求:包含 N(N>0) 个 await 表达式(不存在 await 表达式的话 IDE 会发出警告),表示需要异步执行的任务。
     (3)返回类型:只能返回 3 种类型(void、Task 和 Task<T>)。Task 和 Task<T> 标识返回的对象会在将来完成工作,表示调用方法和异步方法可以继续执行。
     (4)参数:数量不限,但不能使用 out 和 ref 关键字。
     (5)命名约定:方法后缀名应以 Async 结尾。
     (6)其它:匿名方法和 Lambda 表达式也可以作为异步对象;async 是一个上下文关键字;关键字 async 必须在返回类型前。
 

C#字段和属性

一、浅谈访问修饰符

作用:设定访问权限,限制类中的成员(属性、方法等)可访问的范围,访问范围通常有,类的内部、类的外部。

最常用的类型:private(私有的,仅类的内部使用);public(公有的,没有访问限制)

注意:类的成员在定义的时候没有显示的写出访问修饰符,则默认是private。对应到字段和属性中,通常字段修饰为private,属性修饰为public。


 

二、字段的使用

1.关于字段

a.字段又称为:“成员变量”,一般在类的内部做数据交互使用。

b.字段命名规范:camel命名法(首单词字母小写)。

 

2.通俗的理解

私有化:字段就好比我们的个人财产,仅供个人使用,所以一般是private修饰。

添加标准:根据程序的功能需求,具体来添加需要的不同类型的字段。


 

四、属性

1.属性的使用

作用:在面向对象设计中主要使用属性描述对象的静态特征。

要求:一般采用Pascal命名法(首字母大写),数据类型要和对应的字段要一致。

 

2.属性的理解

a.属性其实就是外界访问私有字段的入口,属性本身不保存任何数据,在对属性赋值和读取的时候其实就是操作的对应私有字段。

图例:

b.属性本质其实就是一个方法,通过get和set方法来操作对应的字段,通过反编译工具我们可以看出,如图:

3.属性的作用

A.避免出现非法数据,例如一个年龄属性,正常逻辑是年龄是不可以出现负数的,如果用户对年龄进行了负数的赋值,我们通过属性的set方法加入判断逻辑,从而排除这种非法数据。

示例:

B.限定属性只读或者只写,例如有些属性为了保护数据,我们只能读取,而不能赋值。具体使用的话,我们根据需要,屏蔽set或get方法达到只读和只写。

示例:

C.没有对应私有字段的属性,例如根据生日属性获取到年龄。

示例:

 

 

 


 

 

五、字段与属性比较

字段(成员变量)

a.字段主要是为类的内部做数据交互使用,字段一般是private。

b.字段可读可写。

c.当字段需要为外部提供数据的时候,请将字段封装为属性,而不是使用公有字段(public修饰符),这是面向对象思想所提倡的。

 

属性(方法)

a.属性一般是向外提供数据,主要用来描述对象的静态特征,所以,属性一般是public。

b.属性具备get和set方法,可以在方法里加入逻辑处理数据,灵活拓展使用。


 

六、自动属性

1.属性编写新语法(自动属性:.NET3.0及其后续版本)

示例:

 

 

快捷方式:prop+tab+tab

你知道的网络推广有几种方法?

现在的网络营销手段多种多样,你可以采取多样话的全方位,多连接相结合的方式来进行宣传推广。那么怎样做网络推广,怎样做才能有效果呢?下面由小编为大家讲解几种常见的网络推广方法:
  网络营销的几种推广方法:
  一、搜索引擎排名推广
  网络对人们日常生活影响越来越大,网络营销就可以在互联网上大方面进行网络推广,主要是网站做好SEO,SEO最常用、又简单的方法包括增加内部连接、增加外部链接、做好网页标题和文章的关键词、不要用图片作为频道链接、经常保持网站内容更新。
  二、论坛贴吧免费推广法
  目前的论坛也是推广的重要部分,贴吧,在上面注册,并经常去发精华帖子,帖子内容最好自己写,植入自己公司的品牌名和营销信息,不要照搬别人的。另外每个论坛最少注册十几个马甲,经常换马甲去顶自己的帖子。最后,可以把自己的签名设置成公司名字和网址,这样别人看来就可以更好的认识你的公司了,并加强公司的名声,是个不错的选择。
  三、友情链接推广法
  1.常规友情链接优化; 网站友情链接限制为:网站内容、产品、行业、相似类型、关键字等相关网站。
  2.广告互惠友情链接。寻找广告内容互惠互利合作网站,这样在网络推广上有着互助作用,各有所得。
  四、 新闻软文免费推广法
  围绕企业品牌、产品、促销活动、创始人的传奇故事写一些软文,联络各个熟悉的网站的记者帮忙发布,文章里面一定要带上企业品牌、产品、促销活动的名称和关键字,很多网民看了感兴趣都会去搜索的。当然,虽然是免费推广,但不至于节省的一分钱都不花。平时为了维护关系可能要请这些记者吃吃饭、喝喝茶,或者邀请他们参加一些自己企业的发布会,逢年过节给他们邮寄一些小礼品联络感情
  五、 QQ群推广法
  QQ群推广法也是网络推广上必不可少的一部分,至少注册十几个qq,每个qq加入几十个群,经常找一些好玩的有用的短信息在群里面发,后面带上自己的营销信息,但不要一上去就发广告,以免被群主踢出来。也可以给群成员发群邮件进行推广。最后,建议把qq资料设置成女的,挂上几张漂亮的美女相片,效果会更好,当然,可别被别人误认为是从事灰色地带的方面。
  六、博客免费推广法
  博客呢也是不可忽视的一种推广平台。在发信息的时候经常要在上面发布植入企业营销信息的博客文章发上去。博客推广的好处是不会被删文章。另外,可以去别的热门博客留言评论,留下自己的博客地址和公司网址,有很好的效果。这个方法都可以去试试看。只是现在做博客推广这一块的也逐渐减少了,按照自己公司的能力和情况,可以斟酌一下要不要做。
  七、SNS网站免费推广法
  在几个主流的热门的SNS网站全都注册,并且根据公司目标客户定位,大量添加上面的用户为好友,这样就有很多人知道你了。另外对于网络推广,之前很多SNS网站都有日志空间,可以在上面发软文,让自己的好友分享,这样很多人都关注你的文章,关注你的网站。最后,很多SNS网站都有圈子或者群组,经常在群组里活跃,经常发布有用的消息,也可以吸引大家的注意力。但是现在靠这种方式的比较少了,所以就可以针对性的考虑要不要做着一块了,对这方面不做重点推荐。
  这以上七种是常见的网络营销推广的方法,对中小型的企业来说,网络营销无异于是现在推销自己美品牌的最好的途径,他可以让产品更快的到达消费者的视线。也能够让消费者更全面的了解产品,他是企业与消费者之间的桥梁,这七种方式,是网络营销最常使用的方法,也是企业以后发展的方向。