Anaconda下安装Talib库[转]

1、 如果你的系统是x64平台,直接使用命令pip install talib安装,会报错。 原因在于python pip源中TA-Lib是32位的,不能安装在X64平台上, 而从TA-Lib的官网 http://ta-lib.org 下载的安装包其实也是32位的,如果你的系统平台是64位的,一样无法正确安装。

正确的方法是下载64位的安装包,本地安装,64位安装包官网并没有提供,必须自行下载。

talib库有很多第三方库,安装的时候尽量找靠谱的源。

加州大学的python库:Archived: Python Extension Packages for Windows – Christoph Gohlke (uci.edu)

按ctrl+F键 页面搜索 Ta-lib 即可找到

2、 注意要下载自己python版本所对应的文件, 所以选择 TA_Lib-0.4.19-cp38-cp38-win_amd64.whl

否则后续安装又会报错 “ERROR: TA_Lib-0.4.19-cp39-cp39-win_amd64.whl is not a supported wheel on this platform.”</p>

把TA_Lib-0.4.19-cp38-cp38-win_amd64.whl 放在Anaconda工作文件夹下面, 然后直接敲命令 pip install TA_Lib-0.4.19-cp38-cp38-win_amd64.whl

你会发现成功安装~

Anaconda报错:ImportError: DLL load failed while importing _ssl: 找不到指定的程序。

Win10系统安装了Anaconda3-2022.05-Windows-x86_64.exe版本,并把D:\Anaconda3;D:\Anaconda3\Scripts;D:\Anaconda3\Library\bin;D:\Anaconda3\Library\mingw-w64\bin加入到环境变量中后运行jupyter notebook命令,仍报了:ImportError: DLL load failed while importing _ssl: 找不到指定的程序。这样的错误。

一番折腾之后,总算在Stack Overflow上找到解决方法:

从目录 anaconda3\Library\bin 拷贝下面的文件到 anaconda3/DLLs中。

  • libcrypto-1_1-x64.dll
  • libssl-1_1-x64.dll

再次运行jupyter notebook命令,成功打开网页。

Jupyter介绍[转]

Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言。

Jupyter Notebook 的本质是一个 Web 应用程序,便于创建和共享程序文档,支持实时代码,数学方程,可视化和 markdown。 用途包括:数据清理和转换,数值模拟,统计建模,机器学习等等 [1]  。

用户可以通过电子邮件,Dropbox,GitHub 和 Jupyter Notebook Viewer,将 Jupyter Notebook 分享给其他人。

在Jupyter Notebook 中,代码可以实时地生成图像,视频,LaTeX和JavaScript。

组件

Jupyter包含以下组件:

Jupyter Notebook 和 Notebook 文件格式

Jupyter Qt 控制台

内核消息协议 (kernel messaging protocol)

许多其他组件

下载安装

一种方式是通过 pip 命令安装。

pip install jupyter

复制

另一种方式是使用集成科学计算环境Anaconda。推荐使用这种方式,下载过程就不说了。根据自己的系统环境,选择对应的版本进行下载。安装基本上也就是一路next,也没有什么要说的。

pip install jupyter

注:Anaconda是Python另一个非常流行的发行版,它之后有着自己的叫做“conda”的安装工具。用户可以使用它来安装很多第三方包。然而,Anaconda会预装很多包,包括了Jupyter Notebook,所以若已经安装了Anaconda,则Jupyter已经自动安装完毕。

启动Jupyter Notebook

使用 Anaconda 安装成功后,默认会将 Jupyter Notebook的启动程序添加到环境变量中。启动程序为jupyter-notebook。可以进入命令行,然后使用 jupyter-notebook --h 来查看使用说明。

(c:\soft\py3) C:\Users\wangwei01>jupyter notebook --h
usage: jupyter-notebook [-h] [--pylab [NOTEBOOKAPP.PYLAB]]
                        [--keyfile NOTEBOOKAPP.KEYFILE]
                        [--client-ca NOTEBOOKAPP.CLIENT_CA]
                        [--notebook-dir NOTEBOOKAPP.NOTEBOOK_DIR]
                        [--port-retries NOTEBOOKAPP.PORT_RETRIES]
                        [--config NOTEBOOKAPP.CONFIG_FILE]
                        [--certfile NOTEBOOKAPP.CERTFILE]
                        [--log-level NOTEBOOKAPP.LOG_LEVEL]
                        [--browser NOTEBOOKAPP.BROWSER]
                        [--transport KERNELMANAGER.TRANSPORT]
                        [--ip NOTEBOOKAPP.IP] [--port NOTEBOOKAPP.PORT] [-y]
                        [--script] [--no-mathjax] [--no-browser]
                        [--allow-root] [--debug] [--no-script]
                        [--generate-config]

optional arguments:
  -h, --help            show this help message and exit
  --pylab [NOTEBOOKAPP.PYLAB]
  --keyfile NOTEBOOKAPP.KEYFILE
  --client-ca NOTEBOOKAPP.CLIENT_CA
  --notebook-dir NOTEBOOKAPP.NOTEBOOK_DIR
  --port-retries NOTEBOOKAPP.PORT_RETRIES
  --config NOTEBOOKAPP.CONFIG_FILE
  --certfile NOTEBOOKAPP.CERTFILE
  --log-level NOTEBOOKAPP.LOG_LEVEL
  --browser NOTEBOOKAPP.BROWSER
  --transport KERNELMANAGER.TRANSPORT
  --ip NOTEBOOKAPP.IP
  --port NOTEBOOKAPP.PORT
  -y, --y
  --script
  --no-mathjax
  --no-browser
  --allow-root
  --debug
  --no-script
  --generate-config

启动前需要先说明一个概念,jupyter notebook中有个叫做工作空间(工作目录)的概念,也就是说如果你想在哪个目录进行之后的工作,那就在哪个目录启动它。例如,这里我想将家目录的的jp_workspace目录作为工作空间,那我就需要进入到这个目录下。

在此文件夹下打开终端,并执行命令:

jupyter notebook

这将开启Jupyter,并使用你的默认浏览器访问URL:http://localhost:8888/tree

像这样:

注意:现在并没有运行一个Notebook,而是仅仅运行了Notebook服务器。

创建一个Notebook

点击“New”按钮,打开菜单选择环境。
这里我的电脑里安装了Python3,因此选择Python3。

命名

点击上方的”Untitled”,然后键入想要的名称。

这里改为demo。

运行Cells

在cell中输入代码后,可以点击

或者可以使用键盘shift + enter运行代码。

注意:当一个页面中有多个单元格时,按顺序运行它们,它们之间则可以共享方法与变量。无需在单元格中重新导入模块和变量。

当运行单元格时,在单元格左侧的单词In旁边有一些方括号。方括号将自动填充一个数字,该数字表示将运行单元格的顺序。例如,如果我们打开一个全新的Notebook并运行该Notebook顶部的第一个单元格,则方括号将填充数字1。

File

File 菜单中主要包含了以下功能:创建新的Notebook、打开新的界面、拷贝当前Notebook、重命名Notebook、保存还原点、恢复到指定还原点、查看Notebook预览、下载Notebook、关闭Notebook。

这里重点强调下下载Notebook选项,它可以将当前Notebook转为py文件、html文件、markdown文件、rest文件、latex文件、pdf文件。

保存检查点(Ctrl + s) 这个功能较特殊且有用,它可以保存以后想用来回滚的检查点,并在需要的时候Revert to Checkpoint。

Edit
接下来是编辑菜单。在这里可以剪切、复制和粘贴单元格。这里也可以删除、分割或合并一个单元。并且也可以在这里重新排序单元格。

选中单元格时,左侧竖条呈蓝色,这时可以对单元格进行操作。
点按”x”剪切单元格。
点按”c”复制单元格。
点按”v”粘贴单元格。
双击”d,d”删除单元格。
选中单元格中的文本框内容时,左侧竖条呈绿色,这时可以对文本进行操作。
使用”Ctrl + 上述单个字符”实现对文本的操作。

注意:我们会发现Edit中有一些条目选项是灰色的,不可点击。这是因为在当前类型的单元格中不可使用这些功能。例如,代码单元格中不能够插入图片,但Markdown单元格中可以。

View
View栏可以开关顶栏和工具栏,还可以开关代码行号(Ctrl + L)。

Insert
Insert栏可以在当前单元格的上方和下方插入单元格。(A / B)

Cell
Cell 菜单主要包含了运行cells、运行cells后并在之后插入新的cell、运行所有cells、运行当前之上的所有cell、运行当前之下的所有cell、改变cell类型(code、markdown、raw nbconvert)等。

Kernel
内核单元用于处理在后台运行的内核。在这里,我们可以重新启动内核,重新连接它,关闭它,甚至更改您的Notebook使用的内核。
虽然我们可能不会经常使用内核,但是在调试Notebook时,可能需要重新启动内核。当这种情况发生时,就会去这里操作,也可使用toolbar的循环箭头重启内核。

Widgets
Widgets菜单用于保存和清除widget状态。小部件基本上是JavaScript小部件,我们可以将其添加到单元格中,以使用Python(或其他内核)生成动态内容。

Help
可以从中查看键盘快捷键,使用界面教程和许多相关工具。

熟悉工具栏

工具栏上的内容都在下图中:

依次来介绍下,保存还原点、在当前位置之下添加cell、剪切当前cell、拷贝选择的cell、复制选择的cell、上移选中的cell、下移选中的cell、运行cell、中断kernel、重启kernel、修改cell类型、打开命令行调色板、美化cell代码。

很明显,工具栏中的功能大多都是菜单栏中的一部分功能的体现,主要是为了方便寻找。

运行Python代码

想要运行Python代码,其实很简单,因为Python代码最后都在 Cell 中编写的。首先在cell中编写好Python代码,然后点击运行,可以直接在下面看到结果。

仔细一点,我们可以发现,第一个cell前面有 “In [1]:”提示符,第二个cell前面有“In[2]:”提示符,同时也有“Out[2]:”输出符,这是因为如果没有print语句的话,Notebook会将当前cell的最后一条语句的结果以“Out[?]:”的方式输出。

编写Markdown

Notebook最友好的一个功能就是可以在cell中通过Markdown来编写文本。我们首先创建一个cell,然后更改类型为markdown,更改成功后,cell开头没有“In[?]:”的提示符。然后点击cell,按照markdown语法来输入文本。

除了对markdown语法的支持外,同时也支持html代码,此外,也支持latex公式语法。

使用latex公式时,如果需要在当前行内插入公式,公式前后分别需要一个$,如果需要在下一行单独插入公式,公式前后分别需要两个$。

在markdown类型的cell中输入以下内容:

## 这是一个二级标题

这是一个markdown类型的cell

- 下面演示了对html代码的支持:

  <a href="www.naodongopen">这是使用html的a标签实现的超链接</a>


- 下面演示的对latex公式的支持:

  当前行内插入公式:$ \int_0^{+\infty} x^2 dx $

  下一行插入公式:$$ \int_0^{+\infty} x^2 dx $$

运行该cell,得到以下结果:

开启终端或其他

Jupyter Notebook中,除了代码页面外,还可以开启终端,或文本。
终端框实现了在web网页中打开服务器端的操作系统终端。允许你运行bash,Powershell等shell。

查看什么正在运行

在Jupyter服务器的首页(http://localhost:8888/tree)中,有另外两个按钮:Running和Clusters。

Running中会告诉你哪个Notebooks和终端在运行。这对于你想在关闭服务器前确保相应数据被保存的情况将很有用处。

安装插件管理器

第一步:用pip安装插件管理包

pip install jupyter_contrib_nbextensions
pip install jupyter_nbextensions_configurator

第二步:安装一些插件并启用插件管理器

jupyter nbextensions_configurator install --user
jupyter nbextensions_configurator enable --user

然后打开Jupyter notebook会发现菜单栏多了一个选项Nbextensions

记得勾选第一项,否则下方插件是不可选状态。

我们可以通过命令来管理开户中或关闭某个插件,但是我觉得还是通过直接勾选我们需要的插件效率更高。

选择插件

我们从上面可以看出,jupyter notebook有很多插件,我们该用哪一个呢?我推荐5款个人认为不错的插件。

  • Table of Contents
  • Execute Time
  • Nofity
  • Codefolding
  • Hinterland

下面分别介绍一下它们的功能

Table of Contents是一款自动生成目录的工具,它能够通过我们我们富文本中定义的标题自动生成目录,这样我们能够通过点击左侧目录快速定位到我们想要的到达的代码片段。

Execute Time顾名思义,执行时间,我觉得这是一款非常实用的插件,在企业项目开发中,效率是永远无法越过的一个门槛,和学术上理论效果足够优秀即可不同,在企业项目中对效率要求也很高,因此,我们需要统计代码的运行时间,其中最初级的用法就是在每个函数开始和结尾处写一个计时语句,这样比较繁琐。然后再高阶一些的用法就是通过装饰器写一些计时器,在每个函数上调用这个装饰器。其实,如果用jupyter notebook完全没必要这么麻烦。我们只需要打开Execute Time,它就能统计每个cell的运行耗费时间,结束时间等,非常详细,一目了然。

Nofity同样是一款非常实用的插件,当我们运行一个耗时较长的代码时,我们不可能一直盯着屏幕等待,但是我们又希望及时知道它运行结束了,Notify这款插件就可以实现这个功能,它能够在代码运行结束时发出通知,及时告知你代码运行结束了。

Codefolding是一款代码折叠工具,有时候我们写的一个函数非常长,但是我们又不关注 ,这样在阅读过程中会使得效率很低,代码折叠就是一个不错的选择,折叠我们不关注的代码块,Codefolding能够像其他IDE那样让你轻松自如的折叠代码块。

Hinterland是一款自动补全插件,称一个IDE“优秀”,如果没有自动补全显然是说不过去的。jupyter notebook自带补全功能,但是每次都需要点击tab键来补全,这样效率比较低,我们可以通过勾选Hinterland让jupyter notebook具备自动补全功能,当我们输入几个包含字母后它能够快速补全我们想要的函数,补全速度堪比pycharm。

主题修改

很多同学使用jupyter notebook都会觉得,这款开发工具界面太单调了,只有纯白色的主题,其实并不是这样,jupyter notebook也支持主题修改,而且非常方便。

首先在命令行下输入下面命令安装主题,

$ pip install jupyterthemes

jupyter notebook的主题管理工具叫做jt,我们可以通过下面命令查看可用主题,

$ jt -l
Available Themes:
   chesterish
   grade3
   gruvboxd
   gruvboxl
   monokai
   oceans16
   onedork
   solarizedd
   solarizedl

然后通过下面命令设置主题,

$ jt -t <theme_name>

其中theme_name为主题名称。

如果觉得不满意,想退回默认主题,可以通过下方命令实现,

$ jt -r

多语言支持

很多同学是因为Python而解除到jupyter notebook的,因此会认为这就是一款Python专属的开发工具,如果这样的话,那么也不足以我专门用一篇文章来介绍这款开发工具。

它更像是eclipse、IDEA、vscode,是一款综合的开发工具,它不仅支持Python,还支持C++、julia、R、ruby、Go、Scala、C#、Perl、PHP、Octave、Matlab、Lua、Tcl、等多种编程语言,功能十分强大,支持语言详情,请查看下方链接,

https://link.zhihu.com/?target=https%3A//github.com/jupyter/jupyter/wiki/Jupyter-kernels

不同语言的配置方式各不相同,这里不再一一介绍,可以根据自己需要的语言自行在网上搜索相关配置资料进行配置。

jupyter notebook服务

如果非要找出使用jupyter notebook的缺点,我认为就是每次启动的时候相对繁琐,我们启动本地安装的IDE,一个命令或者点击一下图标即可,但是如果启动jupyter notebook就需要进入命令行或终端,输入“jupyter notebook”进行打开,如果使用的是虚拟环境,首先还要激活虚拟环境,这无疑是非常繁琐的,而且启动后它会占用一个终端或命令行窗口,如果意外关闭则会终止jupyter notebook服务。其实,这也是有解决方法的,我们搭建一个持续化的jupyter notebook服务,让它一直在服务器后台运行,这样既不占用窗口,也不需要繁琐的打开步骤,我们只需要把对应的URL收藏,每次需要时能够秒级速度打开,下面就来介绍一下jupyter notebook的搭建步骤。

第一步:获取sha1密码

在命令行下输入ipython,

In [1]: from IPython.lib import passwd
In [2]: passwd()
Enter password:
Verify password:
Out[2]: 'sha1:746cf729d33f:0af9cda409de9791f237a6c46c3c76a3237962fc'

导入passwd函数,调用后会让你输入密码,你可以设置一个明文密码,例如123,然后它会生成一个sha1密码串,这个很重要,后面会用到。

修改jupyter配置文件,linux系统配置文件路径为~/.jupyter/jupyter_notebook_config.py,windows系统配置文件路径为C:\Users\User\.jupyter\jupyter_notebook_config.py,如果没有这个文件,可以使用下面命令生成,

$ jupyter notebook --generate-config

这个配置文件很长,以linux为例,主要关注的是如下几项,

c.NotebookApp.ip = '*'  
c.NotebookApp.password = u'sha1:xxx:xxx' 
c.NotebookApp.open_browser = False 
c.NotebookApp.port = 8888
c.NotebookApp.enable_mathjax = True 

c.NotebookApp.ipc.NotebookApp.port,ip要和服务器保持一致,端口可以自行设定,不和其他端口冲突即可,后续访问时在浏览器输入ip:port即可。

c.NotebookApp.password就是前面生成的sha1密码串,复制过来即可。

c.NotebookApp.open_browser = False 的含义为是每次启动命令时是否打开浏览器,由于我们用的时候直接输入URL即可,所以这里不需要打开浏览器。

c.NotebookApp.enable_mathjax的含义为是否用mathjax,它是一种用于数学公式显示的工具,这里选True。

配置好这几项之后保存退出,输入下面命令即可启动,

$ nohup jupyter notebook > /dev/null 2>&1 &

nohup的含义是后台运行,这样就不用占用一个窗口来了。

配置好之后只要服务器不关机,jupyter notebook的服务会一直处于运行状态,我们随时可以使用,只需要打开ip:port即可。

Jupyter现如今已经成为Python开发中举足轻重的IDE,在数据分析等领域应用非常广泛。

尤其,随着Python逐渐在机器学习、数据分析、可视化、自动化办公等方面越来越广泛的应用,Jupyter会得到更多的重视。

使用InternalsVisibleTo给assembly添加“友元assembly”[转]

C#的internal关键字可以使标记的方法,字段或者属性等等只能在当前assembly内部使用,那么如果其他的assembly需要使用这个internal的方法的时候怎么办呢?.NET提供了一种类似于C++中的友元类的方式来完成这个功能,那就是使用InternalsVisibleTo。

这种情况常见于做测试的时候,需要另外一个项目来测试项目中的internal方法所标记的功能,所以有了InternalsVisibleTo,我们就不用为了做单元测试而把一个本不该公开的方法改为public了.

使用InternalsVisibleTo还有一些需要注意的地方,特别是PublicKey不太容易弄的明白,下面先来说说这个InternalsVisibleTo该怎么使用:

先来说明一下前提:Project1是功能项目,Project1.Test (assembly name: Project1.Test.dll)是为做Project1的测试工程。

1. 打开Project1的Assembly.cs文件,在文件的末尾加上这样一句话:

[assembly: InternalsVisibleTo("Project1.Test, PublicKey=******")]

其中PublicKey=******应该替换成Project1.Test.dll的public key,至于如何获取PublicKey,请看文章末尾的Notes部分.

2. 确认namespace: System.Runtime.CompilerServices 添加到了Assembly.cs的namespace引用中,因为InternalsVisibleTo位于命名空间System.Runtime.CompilerService中。

Notes:

1. 如何获取PublicKey?

A: 在命令行下,使用sn -Tp Project1.Test.dll就可以看到PublicKey和PublicKeyToken

2. 如果Project1是个strong-named的项目,那么InternalsVisibleTo必须指定PublicKey,所以Project1.Test也必须使用强签名才能正确使用InternalsVisibleTo, 不然编译会出错,如果Project1没有使用强签名,那么Project1.Test也不必使用强签名,而且在使用InternalsVisibleTo的时候只需要程序集的名字就可以了,不需要设置PuklicKey。

C# 2 之 #pragma warning 警告禁用指令[转]

今天我们来看点不一样的。

Part 1 早期禁用编译器警告信息


还记得我们在学习语言配置的时候用到的 .csproj  格式的文件吗?这个文件专门对项目设置配置信息,比如 C# 的语言版本之类的。在这个文件里,我们还可以配置取消编译器警告的信息。

我们先来回忆一下编译器警告和编译器错误。编译器警告是一个提示信息,默认情况用的是绿色波浪线表示代码段,表达这段代码有一些运行期间无伤大雅,但不符合规范使用的信息。例如下面的代码:

可以从代码里看出,此时 hello 变量只定义了但没有使用,因此编译器会对这样的错误使用给出编译器警告。但是这样的错误不是致命错误,因为它只是定义了没使用,也不影响程序的正常执行。

编译器错误则是一个信息,表示代码具有严重错误或无法编译的致命错误信息。比如 C# 要求每一个语句要用分号结尾。但如果缺失分号,编译器会自动产生编译器错误信息。这样的代码是无法通过编译的。

编译器警告是不重要的错误,但多起来也挺烦人的。有些时候部分编译器警告是可以忽略掉的,因此满篇都是绿色的波浪线看着也挺不舒服的。因此我们可以对这些编译器警告信息予以忽略操作。让编译器不再对这些错误产生警告。

办法是这样的:我们打开项目的 .csproj 为后缀名的配置文件,它一般都长这样:

<PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    ...
</PropertyGroup>


我们在 标签里,在和 标签同级别的地方配上 标签,里面写 CS0219:

  <PropertyGroup>
      <TargetFramework>net6.0</TargetFramework>
      ...
  • CS0219

    这里 标签表示的是,整个项目需要禁用掉哪些警告信息,下次编译器就不会对这些信息报错了。里面写的是警告禁用的编号代码。我们回到最开始那个图片上,你可以看到,CS0219 后跟上了错误的信息内容和解释文字,而这个 CS0219,就是编译器对这些警告或错误信息给出的唯一编号。你只需要把对应的错误编号写到 里后,所有 CS0219 错误的信息,编译器就不再会给出了。

回到代码:

你会发现,缺失警告的波浪线消失了。这个就是配置和取消警告信息的过程。

但是可以发现,这样的配置有一个严重的弊端:它是对整个项目起效的。它无法对文件为单位取消警告信息,整个项目都取消的话,这个范围未免也有点太大了一些。所以,原生的 C# 并不支持文件为单位的警告信息取消。

另外,Visual Studio 定义了四种编译器报错的级别,分别是 Hidden(隐藏级别报错)、Info(信息级别报错)、Warning(警告级别报错)和 Error(错误级别报错)。而绿色波浪线的错误信息级别是 Warning 级别。而 Visual Studio 还定义了两种级别,一个叫 Hidden,一个叫 Info。Hidden 级别的编译器信息,不会用任何的标记来标记错误书写的代码段,唯一能发觉到它的存在的办法是,把你的代码光标(就是标识你书写代码到哪里的那个文字间的闪烁竖线条)放在这个所在行上,然后你会在代码所在行的行号旁看到一个灯泡图标,里面可以看到对应的信息;而 Info 级别会有标记错误代码段落的标记,不过它不是绿色也不是红色波浪线,而是灰色的四个小圆点,标识你的错误代码段开头的位置上。这样的标记很不容易引起注意,因为它比起编译器警告信息来说还要低一个级别,这类警告信息,你改不改正都无伤大雅。而比 Info 大一个级别的才是编译器警告(Warning 级别),最后才是编译器错误(Error 级别)。

Part 2 #pragma warning disable 指令


C# 2 为了解决这样的错误提示消除过程无法实现的问题,诞生了新的语句:#pragma warning disable 指令。

pragma warning disable 指令是一个组合单词的指令,也就是说,pragma、warning 和 disable 这三个单词都必须一起写出来,而且必须是先 pragma 后 warning,最后是 disable;另外,在 pragma 前面,还需要加上预处理指令的井号 # 标记。

我们把它当成是一个预处理指令一样的使用就行。不过这个预处理指令和 #region 还有 #endregion 类似,它可以用于任何代码行上。以前的 #if 只能放在文件开头,或者前面带有一些 using 指令什么的。但 #pragma warning disable 指令可以写在任何位置。唯一需要注意的是,它是预处理指令,因此必须单独占据一行;也就是说你不能对 #pragma warning disable 这三个单词的每两个单词中间插入换行,这是唯一需要注意的。

比如,给出一个简单的示例程序:

pragma warning disable IDE0059

pragma warning disable CS0219

pragma warning disable IDE0005

using System;

static class Program
{
static void Main()
{
string hello = “Hello!”;
}
}
其中:

IDE0059 信息:对一个变量的赋值没有意义;

CS0219 信息:变量定义了但没有使用过;

IDE0005 信息:using 指令没有使用过。

你可以使用这个语法来对它们的错误信息进行消除。当然,C# 也允许你写在一行里:

pragma warning disable IDE0059, CS0219, IDE0005

using System;

static class Program
{
static void Main()
{
string hello = “Hello!”;
}
}
用逗号分隔每一个编号即可。

Part 3 #pragma warning restore 指令


当然,#pragma warning 也不是必须跟 disable。C# 2 为了更为灵活地控制编译器警告报错的过程,该指令还有一个写法:#pragma warning restore。它表示,既报错禁用后,恢复对指定编号的报错。

pragma warning restore 的语法和 #pragma warning disable 的语法完全一样,即后面跟上的是错误编号(如果是多个错误编号的话,用逗号分开),但 #pragma warning restore 一般用在它的前面已经出现过 #pragma warning disable 的同编号错误警告的时候。举个例子,我现在有这样的代码:

它表示计算一个数字的阶乘。但是这个方法我们尚未使用过,因此我们会在方法的上方插入一个 #pragma warning disable 的警告禁用指令。不过,我如果在 Factorial 方法下面还有别的代码的话,这个警告禁用的范围就超出了我们预想的范围:我们只想要禁用掉 Factorial 这一个方法的使用性的报错,而别的方法不影响。

我们可以这么写:

pragma warning disable IDE0051

private static long Factorial(int n)

pragma warning restore IDE0051

{
long result = 1;
for (int i = 1; i <= n; i++)
result *= i;

return result;

}
我们可在报错的 Factorial 方法签名所在行的上下方各插入一行指令。上面是报错,下面是 restore 恢复报错。这里的 IDE0051 就是表示“方法没有使用过”的报错信息。

有人会问,为什么 restore 这个指令写在第 3 行而不是第 10 行后?因为编译器分析和报错只位于整个方法的签名上(你可以看到前面给出的图片,四个小圆点只出现在 Factorial 这个方法名上,而不是整个方法都标上了灰色的四个小圆点。所以,我们只需要插入到这里即可。当然了,你写在第 10 行后也是可以的,也没有错误就是了。

Part 4 #warning 的禁用


C# 早期还有一个叫做 #warning 的指令,它用来控制和表示在当前位置直接产生编译器警告信息。

using System;

static class Program
{
static void Main()
{
}

private static string HelloTo(string name)
{
    return string.Format("Hello, {0}!", name);
}

warning Deprecated code block.

private static string Hello()
{
    return "Hello!";
}

}
比如这样的代码,我们可以看到第 14 行有一个 #warning 指令。我们此时可以直接在第 14 行获得一个编译器警告信息。不过,如果你要禁用这段代码的错误,这里就需要了解一下,#warning 指令的报错机制了。

warning 占用了编译器警告编号是 CS1030。也就是说,你写的 #warning 默认都会产生编号为 CS1030 的编译器警告信息。如果你要想禁用掉,使用 #pragma warning disable CS1030 即可。

using System;

class Program
{
static void Main()
{
}

private static string HelloTo(string name)
{
    return string.Format("Hello, {0}!", name);
}

pragma warning disable CS1030

warning Deprecated code block.

pragma warning restore CS1030

private static string Hello()
{
    return "Hello!";
}

}
比如这样。当然了,毕竟是我们自己临时自定义的警告信息,我们也不建议对自己添加的警告信息再次取消掉它的报错。

Part 5 简记 CS 系列错误编号


Visual Studio 发展到现在,拥有众多的编译器分析出来的编号代码。其中常见的有这些:

CS 系列:C# 语言自身派生的基本语法分析的错误和警告信息;

IDE 系列:和 Visual Studio 绑定的、和你书写的代码可以产生交互的编译器警告信息;

CA 系列:官方提供的、补充的编译器错误和警告信息。

当然还有一些别的,什么 RS 开头的啊,SA 开头的,DA 开头等等的系列。不过这里我们要说的是 CS 开头的。CS 是 C# 语法分析的结果导致的唯一编号序列,它们在使用 #pragma warning 指令的时候,可以不写 CS 前缀,比如 CS1030 可以直接记作 1030,等等。

比如最开始的禁用的代码:

pragma warning disable IDE0059, 219, IDE0005

using System;

static class Program
{
static void Main()
{
string hello = “Hello!”;
}
}
这个 CS0219 可以直接记作 0219 或 219。但别的,都必须带上开头的字母。

Part 6 不能禁用掉编译器错误


编译器错误一般而言是无法禁用的,原因很简单:比如你写的忘了分号的语法错误,编译器肯定是不让编译通过的。因此,#pragma warning 肯定无法使用到这种场合上。它属于严重的错误,不属于去掉编译器警告就能消除掉的错误类型。

作者:SunnieShine
原文地址: https://www.bilibili.com/read/cv15187637/