Android基础入门教程——7.5.5 WebView缓存问题

Android基础入门教程——7.5.5 WebView缓存问题

标签(空格分隔): Android基础入门教程


本节引言:

现在很多门户类信息网站,比如虎嗅,ifanr,钛媒体等等的APP,简单点说是信息阅读类的APP,很多
都是直接嵌套一个WebView用来显示相关资讯的,这可能就涉及到了WebView的缓存了!所谓的页面缓存
就是指:保存加载一个网页时所需的HTML,JS,CSS等页面相关的数据以及其他资源,当没网的时候或者
网络状态较差的时候,加载本地保存好的相关数据!而实现这个缓存的方式有两种,一种是后台写一个
下载的Service,将文章相关的数据按自己的需求下载到数据库或者保存到相应文件夹中,然后下次加载
对应URL前先判断是否存在本地缓存,如果存在优先加载本地缓存,不存在则执行联网请求,同时缓存
相关资源,典型的如旧版本的36Kr,在进去后会先离线文章,然后再显示!当然,本节要讲解的不是
这种自己写逻辑的方式,而是通过WebView本身自带的缓存功能来缓存页面,这种方式使用起来非常
简单,我们只需为WebView设置开启相关功能,以及设置数据库的缓存路径即可完成缓存!具体的
实现我们下面一一道来~


1.缓存的分类:

首先要说的一点是缓存的分类,我们缓存的数据分为:页面缓存和数据缓存

  • 页面缓存:加载一个网页时的html、JS、CSS等页面或者资源数据,这些缓存资源是由于浏览器
    的行为而产生,开发者只能通过配置HTTP响应头影响浏览器的行为才能间接地影响到这些缓存数据。
    缓存的索引放在:/data/data/<包名>/databases
    对应的文件放在:/data/data/package_name/cache/webviewCacheChromunm下

  • 数据缓存:分为AppCache和DOM Storage两种
    我们开发者可以自行控制的就是这些缓存资源,

    • AppCache:我们能够有选择的缓冲web浏览器中所有的东西,从页面、图片到脚本、css等等。
      尤其在涉及到应用于网站的多个页面上的CSS和JavaScript文件的时候非常有用。其大小目前通常是5M。
      在Android上需要手动开启(setAppCacheEnabled),并设置路径(setAppCachePath)和容量
      (setAppCacheMaxSize),而Android中使用ApplicationCache.db来保存AppCache数据!
    • DOM Storage:存储一些简单的用key/value对即可解决的数据,根据作用范围的不同,有Session
      Storage和Local Storage两种,分别用于会话级别的存储(页面关闭即消失)和本地化存储(除非主动
      删除,否则数据永远不会过期)在Android中可以手动开启DOM Storage(setDomStorageEnabled),
      设置存储路径(setDatabasePath)Android中Webkit会为DOMStorage产生两个文件(my_path/localstorage/http_blog.csdn.net_0.localstorage和my_path/Databases.db)

好吧,看完上面,是不是想说一句,卧槽,什么鬼,好复杂的样子
当然,不要去背,知道有这些东西就好了,实际开发用到再慢慢考究,而且我们一般只关心如何
为WebView设置缓存以及如何删除缓存!
我们可以看下我们下面写的demo运行后的文件结构,打开DDMS的File Explorer:

嘿嘿,一目了然是吧~,对了另外还要说下几种缓存的模式:

  • LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
  • LOAD_DEFAULT: 根据cache-control决定是否从网络上取数据。
  • LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式
  • LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
  • LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。

总结:根据以上两种模式,建议缓存策略为,判断是否有网络,有的话,使用LOAD_DEFAULT,
无网络时,使用LOAD_CACHE_ELSE_NETWORK。

接下来堆码时间!


2.为WebView开启缓存功能

下面我们就来为WebView开启缓存功能,先来看下实现的效果图:

运行效果图

流程解析
1.进入页面后默认加载url,然后随便点击一个链接跳到第二个页面,退出APP
2.关闭wifi以及移动网络,然后重新进入,发现无网络的情况下,页面还是加载了,
打开第一个链接也可以加载,打开其他链接就发现找不到网页!
3.点击清除缓存,把应用关闭,重新进入,发现页面已经打不开!

接下来是代码实现:MainActivity.java:

public class MainActivity extends AppCompatActivity {

    private WebView wView;
    private Button btn_clear_cache;
    private Button btn_refresh;
    private static final String APP_CACHE_DIRNAME = "/webcache"; // web缓存目录
    private static final String URL = "http://blog.csdn.net/coder_pig";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        wView = (WebView) findViewById(R.id.wView);
        btn_clear_cache = (Button) findViewById(R.id.btn_clear_cache);
        btn_refresh = (Button) findViewById(R.id.btn_refresh);
        wView.loadUrl(URL);
        wView.setWebViewClient(new WebViewClient() {
            //设置在webView点击打开的新网页在当前界面显示,而不跳转到新的浏览器中
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });
        WebSettings settings = wView.getSettings();
        settings.setJavaScriptEnabled(true);
        //设置缓存模式
        settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        // 开启DOM storage API 功能
        settings.setDomStorageEnabled(true);
        // 开启database storage API功能
        settings.setDatabaseEnabled(true);
        String cacheDirPath = getFilesDir().getAbsolutePath() + APP_CACHE_DIRNAME;
        Log.i("cachePath", cacheDirPath);
        // 设置数据库缓存路径
        settings.setAppCachePath(cacheDirPath);
        settings.setAppCacheEnabled(true);
        Log.i("databasepath", settings.getDatabasePath());

        btn_clear_cache.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                wView.clearCache(true);
            }
        });

        btn_refresh.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                wView.reload();
            }
        });
    }

    //重写回退按钮的点击事件
    @Override
    public void onBackPressed() {
        if(wView.canGoBack()){
            wView.goBack();
        }else{
            super.onBackPressed();
        }
    }
}

代码很简单,我们做的仅仅是开启缓存的功能,以及设置缓存模式以及缓存的数据的路径而已!


3.删除WebView的缓存数据

上面的示例,我们通过调用WebView的clearCache(true)方法,已经实现了对缓存的删除!
除了这种方法外,还有下述方法:

  • setting.setCacheMode(WebSettings.LOAD_NO_CACHE);
  • deleteDatabase(“WebView.db”);和deleteDatabase(“WebViewCache.db”);
  • webView.clearHistory();
  • webView.clearFormData();
  • getCacheDir().delete();
  • 手动写delete方法,循环迭代删除缓存文件夹!

当然,前面也说,我们能这直接操作的只是数据部分,而页面缓存是由于浏览器
的行为而产生,我们只能通过配置HTTP响应头影响浏览器的行为才能间接地影响到
这些缓存数据。所以上述的方法仅仅是删除的数据部分的缓存!


4.示例代码下载:

WebViewDemo7.zipttp://pan.baidu.com/s/1dDi6WMH


5.本节小结:

好的,本节关于WebView缓存问题就到这里,这里只是写了如何为WebView开启缓存,
以及删除缓存,以后遇到再慢慢考究,这里有个映像先~嗯,就说这么多~谢谢

对了,差点忘了贴下本节的参考链接:
Android webView 缓存 Cache + HTML5离线功能 解决
Android记录25-WebView实现离线缓存阅读
Android 清除WebView缓存

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
第1篇 HTML基础   第1章 HTML基础 3   教学录像:22分钟   1.1 HTML的基本概念 4   1.2 HTML发展史 4   1.3 HTML的基本结构 5   1.3.1 HTML文件的编写方法 5   1.3.2 文件开始标签<html> 7   1.3.3 文件头部标签<head> 7   1.3.4 文件标题标签<title> 7   1.3.5 文件主体标签<body> 7   1.3.6 编写文件的注意事项 8   1.4 编写第一个HTML文件 8   1.4.1 HTML文件的编写方法 8   1.4.2 手工编写页面 9   1.4.3 使用可视化软件制作页面 10   1.4.4 使用浏览器浏览HTML文件 14   1.4.5 使用HTML开发的明日图书网 14   1.5 小结 15   1.6 习题 16   第2章 HTML文件基本标记 17   教学录像:44分钟   2.1 HTML头部标记 18   2.2 标题标记<title> 18   2.3 元信息标记<meta> 19   2.3.1 设置页面关键字 19   2.3.2 设置页面描述 20   2.3.3 设置编辑工具 20   2.3.4 设定作者信息 21   2.3.5 限制搜索方式 22   2.3.6 设置网页文字及语言 22   2.3.7 设置网页的定时跳转 23   2.3.8 设定有效期限 24   2.3.9 禁止从缓存中调用 24   2.3.10 删除过期的cookie 25   2.3.11 强制打开新窗口 25   2.3.12 设置网页的过渡效果 26   2.4 基底网址标记<base> 29   2.5 页面的主体标记<body> 30   2.5.1 设置文字颜色——text 31   2.5.2 背景颜色属性——bgcolor 32   2.5.3 背景图像属性——background 32   2.5.4 设置链接文字属性——link 35   2.5.5 设置边距——margin 37   2.6 页面的注释标记 38   2.7 实例演练——创建基本的HTML网页 38   2.8 小结 39   2.9 习题 40   第3章 设计网页文本内容 41   教学录像:29分钟   3.1 标题文字的建立 42   3.1.1 标题文字标记<h> 42   3.1.2 标题文字的对齐方式——align 43   3.2 设置文字格式 44   3.2.1 设置文字字体——face 44   3.2.2 设置字号——size 45   3.2.3 设置文字颜色——color 46   3.2.4 粗体、斜体、下划线——strong、em、u 46   3.2.5 上标与下标——sup、sub 47   3.2.6 设置删除线——strike 48   3.2.7 等宽文字标记——code 49   3.2.8 空格——&nbsp; 49   3.2.9 其他特殊符号 50   3.3 设置段落格式 51   3.3.1 段落标记——p 51   3.3.2 取消文字换行标记——nobr 52   3.3.3 换行标记——br 53   3.3.4 保留原始排版方式标记——pre 53   3.3.5 居中对齐标记——center 54   3.3.6 向右缩进标记——blockquote 55   3.4 水平线标记 56   3.4.1 添加水平线——hr 56   3.4.2 设置水平线的宽度与高度   ——width、height 57   3.4.3 设置水平线的颜色——color 58   3.4.4 设置水平线的对齐方式——align 59   3.4.5 去掉水平线阴影——noshade 60   3.5 其他文字标记 60   3.5.1 文字标注标记——ruby 60   3.5.2 声明变量标记——var 61   3.5.3 忽视HTML标记   ——plaintext、xmp 62   3.6 小结 63   3.7 习题 63   第4章 使用列表 65   教学录像:35分钟   4.1 列表的标记 66   4.2 使用无序列表 66   4.2.1 无序列表标记——ul 66   4.2.2 无序列表的符号类型——type 67   4.3 使用有序列表 69   4.3.1 有序列表标记——ol 69   4.3.2 有序列表的属性——type 70   4.3.3 有序列表的起始数值——start 72   4.4 定义列表标记——dl 73   4.5 菜单列表标记——menu 74   4.6 目录列表——dir 75   4.7 使用嵌套列表 76   4.7.1 定义列表的嵌套 77   4.7.2 无序列表和有序列表的嵌套 78   4.8 小结 79   4.9 习题 80   第5章 超链接 81   教学录像:22分钟   5.1 超链接的基本知识 82   5.1.1 超链接 82   5.1.2 绝对路径 82   5.1.3 相对路径 82   5.2 超链接的建立 83   5.2.1 超链接标记的基本语法 83   5.2.2 建立文本超链接 83   5.2.3 设置超链接的目标窗口 85   5.3 内部链接 87   5.4 书签链接 89   5.4.1 建立书签 89   5.4.2 链接到同一页面的书签 91   5.4.3 链接到不同页面的书签 92   5.5 外部链接 93   5.5.1 通过HTTP协议 94   5.5.2 通过FTP 94   5.5.3 发送E-mail 95   5.5.4 下载文件 96   5.6 其他链接 98   5.6.1 脚本链接 98   5.6.2 空链接 99   5.7 小结 99   5.8 习题 100   第6章 使用图像 101   教学录像:35分钟   6.1 图像的基本格式 102   6.2 添加图像——img 102   6.3 设置图像属性 103   6.3.1 图像高度——height 103   6.3.2 图像宽度——width 104   6.3.3 图像边框——border 105   6.3.4 图像水平间距——hspace 107   6.3.5 图像垂直间距——vspace 108   6.3.6 图像相对于文字基准线的对齐方式   ——align 108   6.3.7 图像的提示文字——alt 110   6.4 图像的超链接 111   6.4.1 设置图像的超链接 111   6.4.2 设置图像热区链接 112   6.5 小结 116   6.6 习题 116   第7章 表格的应用 118   教学录像:48分钟   7.1 创建表格 119   7.1.1 表格的基本构成——table、tr、td 119   7.1.2 表格的标题——caption 120   7.1.3 表格的表头——th 121   7.2 设置表格基本属性 123   7.2.1 表格的宽度——width 123   7.2.2 表格的高度——height 125   7.2.3 表格的对齐方式——align 126   7.3 设置表格的边框 127   7.3.1 表格边框的宽度——border 127   7.3.2 表格边框的颜色——bordercolor 128   7.3.3 表格内框的宽度——cellspacing 130   7.3.4 表格内文字与边框的间距   ——cellpadding 131   7.4 设置表格背景 132   7.4.1 表格的背景颜色——bgcolor 132   7.4.2 表格的背景图像——background 133   7.5 设置表格的行属性 134   7.5.1 高度的控制——height 134   7.5.2 行的边框颜色——bordercolor 135   7.5.3 行的背景颜色——bgcolor、background 136   7.5.4 行文字的水平对齐方式——align 137   7.5.5 行文字的垂直对齐方式——valign 139   7.5.6 表格标题的垂直对齐方式——align 140   7.6 调整单元格属性 141   7.6.1 单元格大小——width、height 141   7.6.2 单元格水平跨度——colspan 142   7.6.3 单元格垂直跨度——rowspan 143   7.6.4 单元格对齐方式——align、valign 144   7.6.5 单元格的背景色 146   7.6.6 单元格的边框颜色——bordercolor 147   7.6.7 单元格的亮边框——bordercolorlight 148   7.6.8 单元格的暗边框——bordercolordark 150   7.6.9 单元格的背景图像——background 151   7.7 表格的结构 152   7.7.1 表格的表头标记——thead 153   7.7.2 表格的表主体标记——tbody 154   7.7.3 表格的表尾标记——tfoot 156   7.8 表格的嵌套 157   7.9 小结 159   7.10 习题 159   第8章 层标记——div 161   教学录像:33分钟   8.1 层 162   8.1.1 层的分类 162   8.1.2 定义数据块 162   8.2 <div>标签 163   8.2.1 <div>标签的简介 163   8.2.2 <div>标签的属性 164   8.2.3 <span>标签与<div>标签 170   8.3 <iframe>标签 172   8.3.1 <iframe>标签的简介 172   8.3.2 <iframe>标签的属性 172   8.4 <layer>标签和<ilayer>标签 174   8.4.1 标签层的使用 175   8.4.2 <layer>标签和<ilayer>标签的区别 176   8.5 应用div制作下拉菜单导航条 176   8.6 小结 179   8.7 习题 179   第9章 编辑表单 181   教学录像:26分钟   9.1 使用表单标签——form 182   9.1.1 处理动作——action 182   9.1.2 表单名称——name 183   9.1.3 传送方法——method 183   9.1.4 编码方式——enctype 184   9.1.5 目标显示方式——target 185   9.2 添加控件 185   9.3 输入类的控件 186   9.3.1 文字字段——text 186   9.3.2 密码域——password 187   9.3.3 单选按钮——radio 188   9.3.4 复选框——checkbox 189   9.3.5 普通按钮——button 190   9.3.6 提交按钮——submit 191   9.3.7 重置按钮——reset 192   9.3.8 图像域——image 193   9.3.9 隐藏域——hidden 195   9.3.10 文件域——file 195   9.4 列表/菜单标记 197   9.5 文本域标记——textarea 198   9.6 id标记 199   9.7 小结 200   9.8 习题 200   第10章 多媒体页面 202   视频讲解:18分钟   10.1 设置滚动文字 203   10.1.1 滚动文字标签——marquee 203   10.1.2 滚动方向属性——direction 203   10.1.3 滚动方式属性——behavior 204   10.1.4 滚动速度属性——scrollamount 205   10.1.5 滚动延迟属性——scrolldelay 206   10.1.6 滚动循环属性——loop 207   10.1.7 滚动范围属性——width、height 208   10.1.8 滚动背景颜色属性——bgcolor 209   10.1.9 滚动空间属性——hspace、vspace 209   10.2 添加背景音乐 211   10.2.1 设置背景音乐——bgsound 211   10.2.2 设置循环播放次数——loop 212   10.3 添加多媒体文件 213   10.3.1 添加多媒体文件标记——embed 213   10.3.2 设置自动运行——autostart 214   10.3.3 设置媒体文件的循环播放——loop 215   10.3.4 隐藏面板——hidden 216   10.3.5 添加其他类型的媒体文件 217   10.4 小结 217   10.5 习题 218   第2篇 HTML 5高级应用   第11章 HTML 5的新特性 221   视频讲解:6分钟   11.1 谁在开发HTML 5 222   11.2 HTML 5的新认识 222   11.2.1 兼容性 222   11.2.2 实用性和用户优先 222   11.2.3 化繁为简 223   11.3 无插件范式 223   11.4 HTML 5的新特性 224   11.5 小结 224   第12章 HTML 5与HTML 4的区别 225   视频讲解:51分钟   12.1 语法的改变 226   12.1.1 HTML 5的语法变化 226   12.1.2 HTML 5中的标记方法 226   12.1.3 HTML 5语法中的3个要点 227   12.1.4 标签实例 228   12.2 新增的元素和废除的元素 228   12.2.1 新增的结构元素 228   12.2.2 新增的块级的语义元素 230   12.2.3 新增的行内的语义元素 231   12.2.4 新增的嵌入多媒体元素与交互性元素 231   12.2.5 新增的input元素的类型 232   12.2.6 废除的元素 233   12.3 新增的属性和废除的属性 234   12.3.1 新增的属性 234   12.3.2 废除的属性 236   12.4 全局属性 237   12.4.1 contentEditable属性 237   12.4.2 designMode属性 238   12.4.3 hidden属性 239   12.4.4 spellcheck属性 239   12.4.5 tabindex属性 240   12.5 小结 240   12.6 习题 240   第13章 HTML 5的结构 242   视频讲解:20分钟   13.1 新增的主体结构元素 243   13.1.1 article元素 243   13.1.2 section元素 245   13.1.3 nav元素 247   13.1.4 aside元素 248   13.1.5 time元素 250   13.1.6 pubdate属性 250   13.2 新增的非主体结构元素 251   13.2.1 header元素 251   13.2.2 hgroup元素 252   13.2.3 footer元素 252   13.2.4 address元素 253   13.3 小结 253   13.4 习题 254   第14章 HTML 5中的表单 255   视频讲解:50分钟   14.1 新增表单元素与属性 256   14.1.1 新增的属性 256   14.1.2 增加与改良的input元素的种类 259   14.1.3 output元素的添加 264   14.1.4 应用新增元素制作注册表单 264   14.2 对表单的验证 266   14.2.1 自动验证 266   14.2.2 checkValidity显式验证法 267   14.2.3 避免验证 268   14.2.4 使用setCustomValidity方法自定义   错误信息 268   14.3 增加的页面元素 269   14.3.1 新增的figure元素 270   14.3.2 新增的details元素 271   14.3.3 新增的mark元素 272   14.3.4 新增的progress元素 274   14.3.5 新增的meter元素 275   14.3.6 改良的ol列表 276   14.3.7 改良的dl列表 276   14.3.8 加以严格限制的cite元素 277   14.3.9 重新定义的small元素 278   14.4 小结 278   14.5 习题 279   第15章 HTML 5中的文件与拖放 280   视频讲解:40分钟   15.1 选择文件 281   15.1.1 通过file对象选择文件 281   15.1.2 使用blob接口获取文件的类型与大小 282   15.1.3 通过类型过滤选择的文件 283   15.2 使用FileReader接口读取文件 285   15.2.1 检测浏览器是否支持FileReader接口 285   15.2.2 FileReader接口的方法 285   15.2.3 使用readAsDataURL方法预览图片 286   15.2.4 使用readAsText方法读取文本文件 287   15.2.5 FileReader接口中的事件 288   15.3 拖放API 290   15.3.1 实现拖放的步骤 290   15.3.2 通过拖放显示欢迎信息 291   15.4 dataTransfer对象应用详解 293   15.4.1 使用effectAllowed和dropEffect属性   设置拖放效果 293   15.4.2 使用setDragImage方法设置拖放图标 294   15.5 小结 295   15.6 习题 295   第16章 多媒体播放 296   视频讲解:35分钟   16.1 HTML 5多媒体的简述 297   16.1.1 HTML 4中多媒体的应用 297   16.1.2 HTML 5页面中的多媒体 297   16.2 多媒体元素基本属性 298   16.3 多媒体元素常用方法 302   16.3.1 媒体播放时的方法 302   16.3.2 canPlayType(type)方法 304   16.4 多媒体元素重要事件 304   16.4.1 事件处理方式 304   16.4.2 事件介绍 305   16.4.3 事件实例 306   16.5 小结 308   16.6 习题 309   第17章 绘制图形 310   视频讲解:1小时32分钟   17.1 canvas的基础知识 311   17.1.1 canvas是什么 311   17.1.2 在页面中放置canvas元素 311   17.1.3 绘制带边框的矩形 312   17.2 在画布中使用路径 314   17.2.1 使用arc方法绘制圆形 314   17.2.2 使用moveTo与lineTo路径绘制火柴人 316   17.2.3 贝塞尔和二次方曲线 317   17.3 运用样式与颜色 319   17.3.1 fillStyle 和 strokeStyle属性 319   17.3.2 透明度 globalAlpha 321   17.3.3 线型 Line styles 323   17.4 绘制渐变图形 325   17.4.1 绘制线性渐变 325   17.4.2 绘制径向渐变 326   17.5 绘制变形图形 328   17.5.1 坐标的变换 328   17.5.2 矩阵变换 330   17.6 组合多个图形 333   17.7 给图形绘制阴影 335   17.8 应用图像 336   17.8.1 绘制图像 336   17.8.2 图像的局部放大 338   17.8.3 图像平铺 339   17.8.4 图像裁剪 341   17.8.5 像素的处理 342   17.9 绘制文字 344   17.10 保存与恢复状态 345   17.11 文件的保存 346   17.12 对画布绘制实现动画 347   17.13 综合实例——桌面时钟 348   17.14 小结 350   17.15 习题 351   第18章 数据存储 352   视频讲解:50分钟   18.1 初识Web Storage 353   18.1.1 什么是Web Storage 353   18.1.2 使用Web Storage中的API 353   18.1.3 sessionStorage和localStorage的实例   ——计数器 355   18.1.4 Web Storage综合实例——留言本 357   18.1.5 JSON对象的存数实例——用户信息卡 359   18.2 本地数据库 361   18.2.1 Web SQL数据库简介 361   18.2.2 使用Web SQL Database API 362   18.2.3 本地数据库实例——用户登录 363   18.3 小结 367   18.4 习题 367   第19章 离线应用程序 368   视频讲解:13分钟   19.1 HTML 5离线Web应用概述 369   19.1.1 离线Web应用概述 369   19.1.2 本地缓存与浏览器网页缓存的区别 370   19.2 创建HTML 5离线应用 370   19.2.1 缓存清单(manifest) 370   19.2.2 配置IIS服务器 372   19.2.3 浏览缓存清单 372   19.3 浏览器与服务器的交互过程 373   19.4 applicationCache对象 374   19.4.1 swapCache方法 375   19.4.2 applicationCache对象的事件 376   19.5 小结 379   19.6 习题 379   第20章 使用Web Worker处理线程 380   视频讲解:25分钟   20.1 Web Worker概述 381   20.1.1 创建和使用Worker 381   20.1.2 Web Worker应用实例——求和运算 382   20.2 在Worker内部能做什么 383   20.3 多个JavaScript文件的加载与执行 384   20.4 线程嵌套 384   20.4.1 单层嵌套 385   20.4.2 在多个子线程中进行数据的交互 387   20.5 小结 390   20.6 习题 390   第21章 通信API 391   视频讲解:4分钟   21.1 跨文档消息通信 392   21.1.1 使用postMessageAPI 392   21.1.2 跨文档消息传输 392   21.2 小结 394   第22章 获取地理位置信息 395   视频讲解:12分钟   22.1 Geolocation API的概述 396   22.1.1 使用getCurrentPosition方法获取   当前地理位置 396   22.1.2 持续监视当前地理位置的信息 398   22.1.3 停止获取当前用户的地理位置信息 398   22.2 position对象 398   22.3 在google地图上显示“我在这里” 399   22.4 小结 401   22.5 习题 401   第3篇 HTML 5项目实战   第23章 旅游信息网前台页面 405   视频讲解:20分钟   23.1 概述 406   23.2 网站预览 406   23.3 关键技术 410   23.3.1 网站主体结构设计 410   23.3.2 HTML 5结构元素的使用 410   23.4 网站公共部分设计 411   23.4.1 设计网站公共header 411   23.4.2 设计网站公共footer 418   23.5 网站主页设计 419   23.5.1 显示网站介绍及相关图片 419   23.5.2 主页左侧导航的实现 421   23.6 留下足迹页面设计 424   23.6.1 播放音乐 424   23.6.2 添加留言功能的实现 425   23.7 小结 426   附录 习题参考答案 427   HTML 5从入门到精通   目 录   X   XI
目录 1. 简介 1 1.1 Hello world 1 1.2 程序结构 2 1.3 类型和变量 3 1.4 表达式 6 1.5 语句 8 1.6 类和对象 12 1.6.1 成员 12 1.6.2 可访问性 13 1.6.3 类型参数 13 1.6.4 基类 14 1.6.5 字段 14 1.6.6 方法 15 1.6.6.1 参数 15 1.6.6.2 方法体和局部变量 17 1.6.6.3 静态方法和实例方法 17 1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 1.8 数组 26 1.9 接口 27 1.10 枚举 28 1.11 委托 29 1.12 特性 30 2. 词法结构 33 2.1 程序 33 2.2 文法 33 2.2.1 文法表示法 33 2.2.2 词法文法 34 2.2.3 句法文法 34 2.3 词法分析 34 2.3.1 行结束符 35 2.3.2 注释 35 2.3.3 空白 36 2.4 标记 37 2.4.1 Unicode 字符转义序列 37 2.4.2 标识符 38 2.4.3 关键字 39 2.4.4 文本 41 2.4.4.1 布尔值 41 2.4.4.2 整数 41 2.4.4.3 实数 42 2.4.4.4 字符 43 2.4.4.5 字符串 44 2.4.4.6 null 文本 46 2.4.5 运算符和标点符号 46 2.5 预处理指令 46 2.5.1 条件编译符号 47 2.5.2 预处理表达式 48 2.5.3 声明指令 49 2.5.4 条件编译指令 49 2.5.5 诊断指令 52 2.5.6 区域指令 52 2.5.7 行指令 53 2.5.8 Pragma 指令 53 2.5.8.1 Pragma warning 54 3. 基本概念 55 3.1 应用程序启动 55 3.2 应用程序终止 56 3.3 声明 56 3.4 成员 58 3.4.1 命名空间成员 58 3.4.2 结构成员 59 3.4.3 枚举成员 59 3.4.4 类成员 59 3.4.5 接口成员 59 3.4.6 数组成员 60 3.4.7 委托成员 60 3.5 成员访问 60 3.5.1 已声明可访问性 60 3.5.2 可访问域 61 3.5.3 实例成员的受保护访问 63 3.5.4 可访问性约束 64 3.6 签名和重载 65 3.7 范围 66 3.7.1 名称隐藏 68 3.7.1.1 通过嵌套隐藏 68 3.7.1.2 通过继承隐藏 69 3.8 命名空间和类型名称 70 3.8.1 完全限定名 72 3.9 自动内存管理 73 3.10 执行顺序 75 4. 类型 77 4.1 值类型 77 4.1.1 System.ValueType 类型 78 4.1.2 默认构造函数 78 4.1.3 结构类型 79 4.1.4 简单类型 79 4.1.5 整型 80 4.1.6 浮点型 81 4.1.7 decimal 类型 82 4.1.8 bool 类型 82 4.1.9 枚举类型 82 4.1.10 可以为 null 的类型 83 4.2 引用类型 83 4.2.1 类类型 84 4.2.2 对象类型 84 4.2.3 dynamic 类型 84 4.2.4 string 类型 85 4.2.5 接口类型 85 4.2.6 数组类型 85 4.2.7 委托类型 85 4.3 装箱和拆箱 85 4.3.1 装箱转换 85 4.3.2 拆箱转换 87 4.4 构造类型 87 4.4.1 类型实参 88 4.4.2 开放和封闭类型 88 4.4.3 绑定和未绑定类型 89 4.4.4 满足约束 89 4.5 类型形参 90 4.6 表达式树类型 91 4.7 dynamic 类型 91 5. 变量 93 5.1 变量类别 93 5.1.1 静态变量 93 5.1.2 实例变量 93 5.1.2.1 类中的实例变量 93 5.1.2.2 结构中的实例变量 94 5.1.3 数组元素 94 5.1.4 值参数 94 5.1.5 引用形参 94 5.1.6 输出形参 94 5.1.7 局部变量 95 5.2 默认值 95 5.3 明确赋值 96 5.3.1 初始已赋值变量 96 5.3.2 初始未赋值变量 97 5.3.3 确定明确赋值的细则 97 5.3.3.1 一般语句规则 98 5.3.3.2 块语句、checked 和 unchecked 语句 98 5.3.3.3 表达式语句 98 5.3.3.4 声明语句 98 5.3.3.5 if 语句 98 5.3.3.6 switch 语句 99 5.3.3.7 while 语句 99 5.3.3.8 do 语句 99 5.3.3.9 for 语句 99 5.3.3.10 break、continue 和 goto 语句 100 5.3.3.11 throw 语句 100 5.3.3.12 return 语句 100 5.3.3.13 try-catch 语句 100 5.3.3.14 try-finally 语句 100 5.3.3.15 try-catch-finally 语句 101 5.3.3.16 foreach 语句 102 5.3.3.17 using 语句 102 5.3.3.18 lock 语句 102 5.3.3.19 yield 语句 102 5.3.3.20 简单表达式的一般规则 102 5.3.3.21 带有嵌入表达式的表达式的一般规则 103 5.3.3.22 调用表达式和对象创建表达式 103 5.3.3.23 简单赋值表达式 103 5.3.3.24 && 表达式 104 5.3.3.25 || 表达式 104 5.3.3.26 ! 表达式 105 5.3.3.27 ?? 表达式 106 5.3.3.28 ?: 表达式 106 5.3.3.29 匿名函数 106 5.4 变量引用 107 5.5 变量引用的原子性 107 6. 转换 109 6.1 隐式转换 109 6.1.1 标识转换 110 6.1.2 隐式数值转换 110 6.1.3 隐式枚举转换 110 6.1.4 可以为 null 的隐式转换 110 6.1.5 null 文本转换 111 6.1.6 隐式引用转换 111 6.1.7 装箱转换 111 6.1.8 隐式动态转换 112 6.1.9 隐式常量表达式转换 112 6.1.10 涉及类型形参的隐式转换 112 6.1.11 用户定义的隐式转换 113 6.1.12 匿名函数转换和方法组转换 113 6.2 显式转换 113 6.2.1 显式数值转换 114 6.2.2 显式枚举转换 115 6.2.3 可以为 null 的显式转换 115 6.2.4 显式引用转换 116 6.2.5 拆箱转换 117 6.2.6 显式动态转换 117 6.2.7 涉及类型形参的显式转换 118 6.2.8 用户定义的显式转换 118 6.3 标准转换 119 6.3.1 标准隐式转换 119 6.3.2 标准显式转换 119 6.4 用户定义的转换 119 6.4.1 允许的用户定义转换 119 6.4.2 提升转换运算符 119 6.4.3 用户定义转换的计算 120 6.4.4 用户定义的隐式转换 120 6.4.5 用户定义的显式转换 121 6.5 匿名函数转换 122 6.5.1 匿名函数转换为委托类型的计算 123 6.5.2 匿名函数转换为表达式树类型的计算 124 6.5.3 实现示例 124 6.6 方法组转换 126 7. 表达式 129 7.1 表达式的分类 129 7.1.1 表达式的值 130 7.2 静态和动态绑定 130 7.2.1 绑定时间 131 7.2.2 动态绑定 131 7.2.3 构成表达式的类型 131 7.3 运算符 131 7.3.1 运算符的优先级和顺序关联性 132 7.3.2 运算符重载 133 7.3.3 一元运算符重载决策 134 7.3.4 二元运算符重载决策 134 7.3.5 候选用户定义运算符 134 7.3.6 数值提升 135 7.3.6.1 一元数值提升 135 7.3.6.2 二元数值提升 135 7.3.7 提升运算符 136 7.4 成员查找 137 7.4.1 基类型 138 7.5 函数成员 138 7.5.1 实参列表 140 7.5.1.1 对应形参 141 7.5.1.2 实参列表的运行时计算 142 7.5.2 类型推断 143 7.5.2.1 第一阶段 144 7.5.2.2 第二阶段 144 7.5.2.3 输入类型 144 7.5.2.4 输出类型 145 7.5.2.5 依赖 145 7.5.2.6 输出类型推断 145 7.5.2.7 参数类型显式推断 145 7.5.2.8 精确推断 145 7.5.2.9 下限推断 145 7.5.2.10 上限推断 146 7.5.2.11 固定 147 7.5.2.12 推断返回类型 147 7.5.2.13 方法组转换的类型推断 148 7.5.2.14 查找一组表达式的最通用类型 148 7.5.3 重载决策 149 7.5.3.1 适用函数成员 149 7.5.3.2 更好的函数成员 150 7.5.3.3 表达式的更佳转换 151 7.5.3.4 类型的更佳转换 151 7.5.3.5 更佳转换目标 151 7.5.3.6 泛型类中的重载 151 7.5.4 动态重载决策的编译时检查 152 7.5.5 函数成员调用 152 7.5.5.1 已装箱实例上的调用 153 7.6 基本表达式 154 7.6.1 文本 154 7.6.2 简单名称 154 7.6.2.1 块中的固定含义 155 7.6.3 带括号的表达式 156 7.6.4 成员访问 157 7.6.4.1 相同的简单名称和类型名称 158 7.6.4.2 语法多义性 159 7.6.5 调用表达式 159 7.6.5.1 方法调用 160 7.6.5.2 扩展方法调用 161 7.6.5.3 委托调用 163 7.6.6 元素访问 164 7.6.6.1 数组访问 164 7.6.6.2 索引器访问 165 7.6.7 this 访问 165 7.6.8 基访问 166 7.6.9 后缀增量和后缀减量运算符 166 7.6.10 new 运算符 167 7.6.10.1 对象创建表达式 168 7.6.10.2 对象初始值设定项 169 7.6.10.3 集合初始值设定项 171 7.6.10.4 数组创建表达式 172 7.6.10.5 委托创建表达式 174 7.6.10.6 匿名对象创建表达式 175 7.6.11 typeof 运算符 177 7.6.12 checked 和 unchecked 运算符 178 7.6.13 默认值表达式 180 7.6.14 匿名方法表达式 181 7.7 一元运算符 181 7.7.1 一元加运算符 181 7.7.2 一元减运算符 181 7.7.3 逻辑否定运算符 182 7.7.4 按位求补运算符 182 7.7.5 前缀增量和减量运算符 182 7.7.6 强制转换表达式 183 7.8 算术运算符 184 7.8.1 乘法运算符 184 7.8.2 除法运算符 185 7.8.3 余数运算符 186 7.8.4 加法运算符 187 7.8.5 减法运算符 189 7.9 移位运算符 190 7.10 关系和类型测试运算符 192 7.10.1 整数比较运算符 192 7.10.2 浮点比较运算符 193 7.10.3 小数比较运算符 194 7.10.4 布尔相等运算符 194 7.10.5 枚举比较运算符 194 7.10.6 引用类型相等运算符 194 7.10.7 字符串相等运算符 196 7.10.8 委托相等运算符 196 7.10.9 相等运算符和 null 197 7.10.10 is 运算符 197 7.10.11 as 运算符 197 7.11 逻辑运算符 198 7.11.1 整数逻辑运算符 199 7.11.2 枚举逻辑运算符 199 7.11.3 布尔逻辑运算符 199 7.11.4 可以为 null 的布尔逻辑运算符 199 7.12 条件逻辑运算符 200 7.12.1 布尔条件逻辑运算符 200 7.12.2 用户定义的条件逻辑运算符 201 7.13 空合并运算符 201 7.14 条件运算符 202 7.15 匿名函数表达式 203 7.15.1 匿名函数签名 204 7.15.2 匿名函数体 205 7.15.3 重载决策 205 7.15.4 匿名函数与动态绑定 206 7.15.5 外层变量 206 7.15.5.1 捕获的外层变量 206 7.15.5.2 局部变量实例化 207 7.15.6 匿名函数表达式计算 209 7.16 查询表达式 209 7.16.1 查询表达式的多义性 210 7.16.2 查询表达式转换 210 7.16.2.1 带继续符的 select 和 groupby 子句 211 7.16.2.2 显式范围变量类型 211 7.16.2.3 退化查询表达式 212 7.16.2.4 from、let、where、join 和 orderby 子句 212 7.16.2.5 select 子句 216 7.16.2.6 Groupby 子句 216 7.16.2.7 透明标识符 216 7.16.3 查询表达式模式 218 7.17 赋值运算符 219 7.17.1 简单赋值 219 7.17.2 复合赋值 221 7.17.3 事件赋值 222 7.18 表达式 222 7.19 常量表达式 223 7.20 布尔表达式 224 8. 语句 225 8.1 结束点和可到达性 225 8.2 块 227 8.2.1 语句列表 227 8.3 空语句 228 8.4 标记语句 228 8.5 声明语句 229 8.5.1 局部变量声明 229 8.5.2 局部常量声明 230 8.6 表达式语句 231 8.7 选择语句 231 8.7.1 if 语句 231 8.7.2 switch 语句 232 8.8 迭代语句 236 8.8.1 while 语句 236 8.8.2 do 语句 236 8.8.3 for 语句 237 8.8.4 foreach 语句 238 8.9 跳转语句 240 8.9.1 break 语句 241 8.9.2 continue 语句 242 8.9.3 goto 语句 242 8.9.4 return 语句 243 8.9.5 throw 语句 244 8.10 try 语句 245 8.11 checked 语句和 unchecked 语句 247 8.12 lock 语句 248 8.13 using 语句 248 8.14 yield 语句 250 9. 命名空间 253 9.1 编译单元 253 9.2 命名空间声明 253 9.3 Extern 别名 254 9.4 using 指令 255 9.4.1 using 别名指令 256 9.4.2 Using 命名空间指令 258 9.5 命名空间成员 260 9.6 类型声明 260 9.7 命名空间别名限定符 261 9.7.1 别名的唯一性 262 10. 类 263 10.1 类声明 263 10.1.1 类修饰符 263 10.1.1.1 抽象类 264 10.1.1.2 密封类 264 10.1.1.3 静态类 264 10.1.2 分部修饰符 265 10.1.3 类型形参 265 10.1.4 类基本规范 266 10.1.4.1 基类 266 10.1.4.2 接口实现 267 10.1.5 类型形参约束 268 10.1.6 类体 272 10.2 分部类型 272 10.2.1 特性 272 10.2.2 修饰符 273 10.2.3 类型形参和约束 273 10.2.4 基类 273 10.2.5 基接口 274 10.2.6 成员 274 10.2.7 分部方法 275 10.2.8 名称绑定 277 10.3 类成员 277 10.3.1 实例类型 278 10.3.2 构造类型的成员 279 10.3.3 继承 280 10.3.4 new 修饰符 280 10.3.5 访问修饰符 281 10.3.6 构成类型 281 10.3.7 静态成员和实例成员 281 10.3.8 嵌套类型 282 10.3.8.1 完全限定名 282 10.3.8.2 已声明可访问性 282 10.3.8.3 隐藏 283 10.3.8.4 this 访问 283 10.3.8.5 对包含类型的私有和受保护成员的访问 284 10.3.8.6 泛型类中的嵌套类型 285 10.3.9 保留成员名称 286 10.3.9.1 为属性保留的成员名称 286 10.3.9.2 为事件保留的成员名称 287 10.3.9.3 为索引器保留的成员名称 287 10.3.9.4 为析构函数保留的成员名称 287 10.4 常量 287 10.5 字段 289 10.5.1 静态字段和实例字段 290 10.5.2 只读字段 291 10.5.2.1 对常量使用静态只读字段 291 10.5.2.2 常量和静态只读字段的版本控制 291 10.5.3 可变字段 292 10.5.4 字段初始化 293 10.5.5 变量初始值设定项 293 10.5.5.1 静态字段初始化 294 10.5.5.2 实例字段初始化 295 10.6 方法 296 10.6.1 方法形参 298 10.6.1.1 值参数 299 10.6.1.2 引用形参 299 10.6.1.3 输出形参 300 10.6.1.4 形参数组 301 10.6.2 静态方法和实例方法 303 10.6.3 虚方法 304 10.6.4 重写方法 305 10.6.5 密封方法 307 10.6.6 抽象方法 308 10.6.7 外部方法 309 10.6.8 分部方法 310 10.6.9 扩展方法 310 10.6.10 方法体 311 10.6.11 方法重载 311 10.7 属性 311 10.7.1 静态属性和实例属性 312 10.7.2 访问器 313 10.7.3 自动实现的属性 317 10.7.4 可访问性 318 10.7.5 虚、密封、重写和抽象访问器 319 10.8 事件 321 10.8.1 类似字段的事件 323 10.8.2 事件访问器 324 10.8.3 静态事件和实例事件 325 10.8.4 虚、密封、重写和抽象访问器 325 10.9 索引器 326 10.9.1 索引器重载 329 10.10 运算符 329 10.10.1 一元运算符 331 10.10.2 二元运算符 331 10.10.3 转换运算符 332 10.11 实例构造函数 334 10.11.1 构造函数初始值设定项 335 10.11.2 实例变量初始值设定项 336 10.11.3 构造函数执行 336 10.11.4 默认构造函数 338 10.11.5 私有构造函数 338 10.11.6 可选的实例构造函数形参 339 10.12 静态构造函数 339 10.13 析构函数 341 10.14 迭代器 343 10.14.1 枚举器接口 343 10.14.2 可枚举接口 343 10.14.3 产生类型 343 10.14.4 枚举器对象 343 10.14.4.1 MoveNext 方法 344 10.14.4.2 Current 属性 345 10.14.4.3 Dispose 方法 345 10.14.5 可枚举对象 345 10.14.5.1 GetEnumerator 方法 346 10.14.6 实现示例 346 11. 结构 353 11.1 结构声明 353 11.1.1 结构修饰符 353 11.1.2 分部修饰符 353 11.1.3 结构接口 354 11.1.4 结构体 354 11.2 结构成员 354 11.3 类和结构的区别 354 11.3.1 值语义 355 11.3.2 继承 355 11.3.3 赋值 356 11.3.4 默认值 356 11.3.5 装箱和拆箱 356 11.3.6 this 的含义 358 11.3.7 字段初始值设定项 358 11.3.8 构造函数 358 11.3.9 析构函数 359 11.3.10 静态构造函数 359 11.4 结构示例 360 11.4.1 数据库整数类型 360 11.4.2 数据库布尔类型 361 12. 数组 365 12.1 数组类型 365 12.1.1 System.Array 类型 366 12.1.2 数组和泛型 IList 接口 366 12.2 数组创建 366 12.3 数组元素访问 367 12.4 数组成员 367 12.5 数组协变 367 12.6 数组初始值设定项 367 13. 接口 369 13.1 接口声明 369 13.1.1 接口修饰符 369 13.1.2 分部修饰符 369 13.1.3 Variant 类型形参列表 370 13.1.3.1 变化安全性 370 13.1.3.2 变化转换 371 13.1.4 基接口 371 13.1.5 接口体 372 13.2 接口成员 372 13.2.1 接口方法 373 13.2.2 接口属性 373 13.2.3 接口事件 374 13.2.4 接口索引器 374 13.2.5 接口成员访问 374 13.3 完全限定接口成员名 376 13.4 接口实现 376 13.4.1 显式接口成员实现 377 13.4.2 所实现接口的唯一性 379 13.4.3 泛型方法实现 380 13.4.4 接口映射 381 13.4.5 接口实现继承 383 13.4.6 接口重新实现 385 13.4.7 抽象类和接口 386 14. 枚举 387 14.1 枚举声明 387 14.2 枚举修饰符 387 14.3 枚举成员 388 14.4 System.Enum 类型 390 14.5 枚举值和运算 390 15. 委托 391 15.1 委托声明 391 15.2 委托兼容性 393 15.3 委托实例化 393 15.4 委托调用 394 16. 异常 397 16.1 导致异常的原因 397 16.2 System.Exception 类 397 16.3 异常的处理方式 397 16.4 公共异常类 398 17. 特性 399 17.1 特性类 399 17.1.1 特性用法 399 17.1.2 定位和命名参数 400 17.1.3 特性参数类型 401 17.2 特性说明 401 17.3 特性实例 406 17.3.1 特性的编译 406 17.3.2 特性实例的运行时检索 406 17.4 保留特性 407 17.4.1 AttributeUsage 特性 407 17.4.2 Conditional 特性 408 17.4.2.1 条件方法 408 17.4.2.2 条件特性类 410 17.4.3 Obsolete 特性 411 17.5 互操作的特性 412 17.5.1 与 COM 和 Win32 组件的互操作 412 17.5.2 与其他 .NET 语言的互操作 412 17.5.2.1 IndexerName 特性 412 18. 不安全代码 413 18.1 不安全上下文 413 18.2 指针类型 415 18.3 固定和可移动变量 418 18.4 指针转换 418 18.4.1 指针数组 419 18.5 表达式中的指针 420 18.5.1 指针间接寻址 420 18.5.2 指针成员访问 421 18.5.3 指针元素访问 422 18.5.4 address-of 运算符 422 18.5.5 指针递增和递减 423 18.5.6 指针算术运算 423 18.5.7 指针比较 424 18.5.8 sizeof 运算符 425 18.6 fixed 语句 425 18.7 固定大小缓冲区 429 18.7.1 固定大小缓冲区的声明 429 18.7.2 表达式中的固定大小缓冲区 430 18.7.3 明确赋值检查 431 18.8 堆栈分配 431 18.9 动态内存分配 432 A. 文档注释 435 A.1 简介 435 A.2 建议的标记 436 A.2.1 <c> 437 A.2.2 <code> 437 A.2.3 <example> 437 A.2.4 <exception> 438 A.2.5 <include> 438 A.2.6 <list> 439 A.2.7 <para> 440 A.2.8 <param> 440 A.2.9 <paramref> 441 A.2.10 <permission> 441 A.2.11 <remark> 442 A.2.12 <returns> 442 A.2.13 <see> 442 A.2.14 <seealso> 443 A.2.15 <summary> 443 A.2.16 <value> 444 A.2.17 <typeparam> 444 A.2.18 <typeparamref> 444 A.3 处理文档文件 445 A.3.1 ID 字符串格式 445 A.3.2 ID 字符串示例 446 A.4 示例 449 A.4.1 C# 源代码 449 A.4.2 生成 XML 452 B. 语法 455 B.1 词法文法 455 B.1.1 行结束符 455 B.1.2 注释 455 B.1.3 空白 456 B.1.4 标记 456 B.1.5 Unicode 字符转义序列 456 B.1.6 标识符 456 B.1.7 关键字 458 B.1.8 文本 458 B.1.9 运算符和标点符号 460 B.1.10 预处理指令 460 B.2 句法文法 463 B.2.1 基本概念 463 B.2.2 类型 463 B.2.3 变量 464 B.2.4 表达式 464 B.2.5 语句 471 B.2.6 命名空间 475 B.2.7 类 475 B.2.8 结构 483 B.2.9 数组 483 B.2.10 接口 484 B.2.11 枚举 485 B.2.12 委托 486 B.2.13 特性 486 B.3 不安全代码的语法扩展 487 C. 参考资料 491

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值