Crystal Reports 是世界上被用的最多的报表工具。尽管 VFP 已经有了内建的报表编辑器,但许多 VFP 程序员还是使用 Crystal 的原因之一,就是因为它支持子报表。子报表就是运行在一个报表中的报表。子报表最常见的用途是为一个父表生成多个子表的报表。
UTF-7 编码在应用程序中不再广泛使用,并且许多规范现在在交换中禁止其使用。 它偶尔还会在不期望遇到 UTF-7 编码数据的应用程序中用作攻击途径。 Microsoft 警告不要使用 System.Text.UTF7Encoding,因为它不提供错误检测。
按照约定,标识符名称不包含下划线 (_) 字符。 该规则将检查命名空间、类型、成员和参数。
使用 LoggerMessageAttribute 进行注释的方法包含泛型类型的参数。
LoggerMessageAttribute 属性的消息字符串包含一个前缀(例如 INFO: 或 ERROR:),这是多余的,因为每个日志消息都有相应的日志级别。
在我们对VS.Net中的水晶报表(Crystal Reports)进行研究之前,我和我朋友对如何将这个复杂的东东加入我们的Web应用有着非常的好奇心。一周以后,在阅读了大量的“HOWTO”文档之后,我们成功地将一些简单的报告加入到了我们的Asp.net程序中,并得到了一些小决窍。 这篇文章教你如何在.Net Web应用中使用水晶报表,也可以让你在学习过程中少走一些弯路。为了得到最好的效果,读者最好需要有一些基础的Asp.Net访问数据库的知识以及使用VS.Net的开发经验。 简介 水晶报表可以由很多的方法得到,其中一个就是使用VS.Net来创建,它提供了非常丰富模型以使我们能够在运行时操作属性和方法。如果你正在使用VS.Net开发.Net程序,那么你就不需要再安装其它软件了,因为他已经内嵌在VS.Net中了。 优点: VS.Net水晶报表有下面一些主要的优点:
如果你的 .NET 6+ 项目引用一个启用源生成代码的包(例如日志记录解决方案),则特定于源生成的分析器将在编译时运行。 本文列出了与源生成代码相关的编译器诊断。
参数和成员的名称更好地用于传达其含义而不是描述其类型,类型描述通常由开发工具提供。 对于成员的名称,如果必须使用数据类型名称,请使用与语言无关的名称,而不要使用语言特定的名称。 例如,请使用与语言无关的数据类型名称 Int32,而不要使用 C# 类型名称 int。
类型包含索引器,该索引器使用的索引类型不是 System.Int32、System.Int64、System.Object 或 System.String。
System.Collections.ReadOnlyCollectionBase
对于引用类型,相等运算符的默认实现几乎始终是正确的。 默认情况下,仅当两个引用指向同一对象时,它们才相等。
从 .NET 6 开始,Rijndael 和 RijndaelManaged 类型标记为已过时。 在代码中使用这些 API 会在编译时生成警告 SYSLIB0022。
从 .NET 6 开始,RNGCryptoServiceProvider 标记为已过时。 在代码中使用会在编译时生成警告 SYSLIB0023。
抽象类型的构造函数只能由派生类型调用。 由于公共构造函数可创建类型的实例,但无法创建抽象类型的实例,因此具有公共构造函数的抽象类型在设计上是错误的。
使用 LoggerMessageAttribute 进行注释的方法的参数之一必须是 ILogger 类型或实现 ILogger 的类型。
A.计量单位转换 这是一个非常简单的例子,主要是为了演示在公式中进行不同变量类型的转换和计算。 有时数据库字段的单位和报表中显示的单位不同,我们需要进行计量单位之间的转换,这时就离不开公式的使用。比如,我们的数据库中有一个Length字段,它记录以米为单位的长度,而在打印时需要以厘米为单位,我们就可以使用下面的函数。 ToText({Order Details.Length} *100) + "厘米" 这里的ToText函数就是转换数字型为字符型。常用的转换函数还有ToNumber等。
使用 LoggerMessageAttribute 进行注释的方法的名称以下划线字符开头。 不允许这种做法,因为这可能会导致符号名称与自动生成的代码相冲突。
使用 LoggerMessageAttribute 进行注释的多个方法正在使用相同的事件 ID 值。 事件 ID 值在每个程序集的范围内必须独一无二。
从 .NET 6 开始,Rfc2898DeriveBytes.CryptDeriveKey(String, String, Int32, Byte[]) 方法标记为已过时。 在代码中使用此 API 会在编译时生成警告 SYSLIB0033。
从 .NET 6 开始,将以下 API 标记为已过时。 在代码中使用这些 API 会在编译时生成警告 SYSLIB0014。
从 .NET 5 开始,DebugInfoGenerator.CreatePdbGenerator() API 标记为已过时。 使用此 API 将在编译时生成警告 SYSLIB0008,并在运行时引发 PlatformNotSupportedException。
建议尽量使用解决方法之一。 但是,如果无法更改代码,可以通过 #pragma 指令或 <NoWarn> 项目设置来禁止显示警告。 如果 SYSLIB1XXX 源生成器诊断未显示为错误,则可以在代码或项目文件中禁止警告。
使用 LoggerMessageAttribute 属性进行注释的方法返回了一个值。
从 .NET 5 开始,以下 API 标记为已过时。 在代码中使用这些 API 会在编译时生成警告 SYSLIB0012。
从 .NET 6 开始,CmsSigner(CspParameters) 构造函数标记为已过时。 在代码中使用此 API 会在编译时生成警告 SYSLIB0034。
从 .NET 6 开始,AppDomain.CreateDomain(String) 和 AppDomain.Unload(AppDomain) 方法标记为已过时。 在代码中使用这些方法会在编译时生成警告 SYSLIB0024,并在运行时引发异常。
从 .NET 6 开始,将以下 API 标记为已过时。 在代码中使用这些 API 会在编译时生成警告 SYSLIB0019。
从 .NET 5 开始,以下 API 标记为已过时。 使用这些 API 会在编译时生成警告 SYSLIB0009,并在运行时引发 PlatformNotSupportedException。
泛型类型包含的类型参数越多,越难以知道并记住每个类型参数各代表什么。 它通常有一个类型参数,如在 List<T> 中,而在某些情况下有两个类型参数,如在 Dictionary<TKey, TValue> 中。 如果存在两个以上的类型参数,则大多数用户都会感到过于困难(例如 C# 中的 TooManyTypeParameters<T, K, V> 或 Visual Basic 中的 TooManyTypeParameters(Of T, K, V))。
接口定义提供某个行为或使用协定的成员。 接口所描述的功能可以被任何类型采用,而不管该类型出现在继承层次结构中的哪个位置。 类型通过实现接口的成员来实现接口。 空接口不定义任何成员。 因此,它不定义可实现的协定。
该规则检测名称通常用于事件的方法。 事件遵循“观察者”或“发布-订阅”设计模式;当必须将一个对象的状态更改传达给其他对象时,它们适用。 如果为响应明确定义的状态更改而调用一个方法,则应由事件处理程序调用该方法。 调用该方法的对象应引发事件而不是直接调用该方法。
使用 LoggerMessageAttribute 进行注释的方法未标记为分部方法。
如果不能提供完整的构造函数集,要正确处理异常将变得比较困难。 例如,具有签名 NewException(string, Exception) 的构造函数用于创建由其他异常引起的异常。 如果没有此构造函数,你无法创建和引发包含内部(嵌套)异常的自定义异常实例,在这种情况下,托管代码应执行此操作。
不支持从进程状态已损坏异常中恢复。从 .NET 6 开始,HandleProcessCorruptedStateExceptionsAttribute 类型标记为已过时。 在代码中使用此 API 会在编译时生成警告 SYSLIB0032。
从 .NET 6 开始,SignerInfo.ComputeCounterSignature() 方法标记为已过时。 在代码中使用此 API 会在编译时生成警告 SYSLIB0035。
从 .NET 6 开始,System.Runtime.CompilerServices.DisablePrivateReflectionAttribute 类型标记为已过时。 此属性在 .NET Core 2.1 和更高版本应用程序中不起作用。 对于 .NET 6 和更高版本的应用程序,在代码中使用会在编译时生成警告 SYSLIB0015。
从 .NET 6 开始,以下方法标记为已过时。 在代码中调用这些方法会在编译时生成警告 SYSLIB0018。 这些方法在运行时引发 PlatformNotSupportedException。
从 .NET 6 开始,以下可变 x509 证书 API 将标记为已过时。 在代码中使用这些 API 会在编译时生成警告 SYSLIB0026。
枚举是一种值类型,它定义一组相关的已命名常数。 默认情况下,System.Int32 数据类型用于存储常量值。 虽然你可以更改此基础类型,但对于大多数情况,既不需要,也不建议你这样做。 使用小于 Int32 的数据类型不会显著提高性能。 如果无法使用默认数据类型,则应使用某种符合公共语言规范 (CLS) 的整型类型,例如 Byte、Int16、Int32 或 Int64,以确保枚举的所有值都可以用符合 CLS 的编程语言表示。
从 .NET 6 开始,以下 API 标记为已过时。 在代码中使用这些 API 会在编译时生成警告 SYSLIB0017。 这些 API 在运行时引发 PlatformNotSupportedException。
从 .NET 6 开始,JsonSerializerOptions.IgnoreNullValues 属性标记为已过时。 在代码中使用会在编译时生成警告 SYSLIB0020。
从 .NET 5 开始,以下 API 标记为已过时。 使用这些 API 会在编译时生成警告 SYSLIB0006,并在运行时生成 PlatformNotSupportedException。
日志记录方法的第一个日志级别参数在日志记录消息中作为模板引用。 不必要这样做,因为第一个日志级别会显式传递给日志记录基础结构。 不需要在日志记录消息中重复它。
日志记录方法的第一个异常参数在日志记录消息中作为模板引用。 不必要这样做,因为第一个异常将显式传递给日志记录基础结构。 不需要在日志记录消息中重复它。
.NET Framework 中的加密配置系统不允许适当的加密灵活性,且不存在于 .NET Core 和 .NET 5+ 中。 .NET 的后向兼容性要求也禁止框架更新某些加密 API 以跟上加密技术的发展。 因此从 .NET 5 开始,以下 API 标记为已过时。 使用这些 API 会在编译时生成警告 SYSLIB0007,并在运行时生成 PlatformNotSupportedException。
泛型类型包含 static(在 Visual Basic 中为 Shared)成员。
从 .NET 5 开始,PrincipalPermissionAttribute 构造函数已过时并生成编译时错误 SYSLIB0002。 不能实例化此属性或将其应用于方法。
领取专属 10元无门槛券
手把手带您无忧上云