我正在为C#类获取Visual Studio代码分析警告CA1506.它说,''FormMain'与来自25个不同命名空间的93种不同(非IComponent)类型相结合.重写或重构此类的方法以减少其类耦合,或考虑将某些类的方法移动到其他一些类型高于95的类耦合表明可维护性差,95到80之间的类耦合表明中等可维护性,低于80的类耦合表明良好的可维护性.
我的问题很简单,我在哪里可以看到FormMain所有类型的列表,所以我可以更好地了解情况?
谢谢.
我的理解(很可能是错误的)是,通过在 Visual Studio 构建中包含 VERSIONINFO 资源文件,可以轻松设置 C++ DLL 或 EXE 的 OriginalFilename 属性。
但我找不到任何为 C# 构建设置 OriginalFilename 的方法。显然它总是设置为正在构建的输出文件的名称。
如果可能的话,我真的希望能够指定这一点。有任何想法吗?谢谢。
我正在研究一个日志记录程序,我想避免在Exception重复记录时反复处理同一个对象,因为它是通过嵌套的调用结构进行渗透.所以我希望能够将Exception对象格式化一次,并为格式化版本提供一个唯一的"异常编号",然后Exception以某种方式标记该对象,以便在以后的日志调用中再次出现时我能够识别它.
我想出的想法是滥用对象的HelpLink字段Exception.我将它设置为包含我的"例外号码"的字符串版本.然后我可以识别该Exception对象,如果它在另一个日志调用中暂时再次出现.
但这可能是一个坏主意吗?有没有涉及我没有想过的陷阱?如果是这样,有没有人有更好的主意?
编辑:为了解释这种情况,这个记录器只会用在我自己的程序上.
我正在尝试确定Windows系统的当前时区.以下代码片段(松散地)基于@MattJohnson在此主题上的答案:当OS显示语言为非英语时获取本地时区标识符
using (RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(
@"SYSTEM\CurrentControlSet\Control\TimeZoneInformation"))
{
if (registryKey != null)
{
string windowsTimeZoneId = registryKey.GetValue("TimeZoneKeyName") as string;
if (string.IsNullOrEmpty(windowsTimeZoneId))
windowsTimeZoneId = registryKey.GetValue("StandardName") as string;
if (!string.IsNullOrEmpty(windowsTimeZoneId))
{
int i = windowsTimeZoneId.IndexOf('\0');
if (i != -1)
windowsTimeZoneId = windowsTimeZoneId.Remove(i);
return ConvertFromWindowsId(windowsTimeZoneId);
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我在第一行"if(string.IsNullOrEmpty(windowsTimeZoneId))"上放置一个断点,那么这就是我在Visual Studio调试器中看到的:

这里发生了什么?RegistryKey.GetValue()返回一个盒装字符串,但为什么它没有检测到两个十六进制00字节并在那里终止字符串?
到目前为止,我已经在我的两台电脑上测试了这个.这是运行Windows 7 64位的.另一个运行Windows 7 32位的是相同的,除了它表示返回的字符串的长度是128个字符而不是127个.
使用regedit.exe查看注册表项时看起来很好,只显示"浪漫标准时间".
一些谷歌搜索出现了这个问题https://social.msdn.microsoft.com/Forums/sqlserver/en-US/eca7ad76-c910-46be-8fb9-876c7cde5c69/registry-read-time-zone-info-differ- when-code-build-on-40-framework-on-host-system-win-7-64-bit?forum = csharpgeneral 否则我找不到任何东西.
该程序使用Visual Studio 2012构建,目标是.Net 2.0.
正如你所看到的,我已经添加了代码来考虑这个"腐败"的结果,但是如果有人可以向我解释这里发生了什么,甚至可能甚至如何避免整个问题,我仍然会感激.
编辑:
该程序使用Visual Studio 2012构建,目标是.Net 2.0.
嗯,情节变浓了.那句话并不完全正确.上面显示的代码堆是在为.Net 2.0目标构建的库程序集中,但它是从一个针对.Net 4.0的程序调用的.现在我尝试从一个针对.Net 2.0的程序调用它,并且没有问题,RegistryKey.GetValue()只返回"浪漫标准时间".所以看起来它确实与.Net Framework 4.0有关,正如在MSDN上发布所暗示的那样.
编辑2 - 开始认为这是"正常的" …
我有一个UITableView,我正在尝试加载36行,然后一直向下滚动到最后一个单元格.
我试过这个:
func reloadData(){
chatroomTableView.reloadData()
chatroomTableView.scrollToBottom(true)
}
extension UITableView {
func scrollToBottom(animated: Bool = true) {
let sections = self.numberOfSections
let rows = self.numberOfRowsInSection(sections - 1)
if (rows > 0){
self.scrollToRowAtIndexPath(NSIndexPath(forRow: rows - 1, inSection: sections - 1), atScrollPosition: .Bottom, animated: true)
}
}
}
Run Code Online (Sandbox Code Playgroud)
但它只会向下滚动一半.
是的,我知道这个问题已经在 Stack Overflow 上被问过和回答过三次。
Xcode / iOS:如何确定代码是否在 DEBUG / RELEASE 版本中运行?
如何知道 iOS App 中的 Debug 或 Release?
但是我对所有这些答案都有两个问题。
除了第三个问题的最后一个答案外,所有答案都基于在构建时测试预处理器定义。我更喜欢一些在运行时做出决定的技术,只是为了完全确定预处理器定义和实际构建最终如何完成之间没有分歧。(好吧,这可能是不可能的。)
但另一点是,我更喜欢在库模块中进行确定的代码,但测试基于主应用程序模块的构建方式。因此,如果(偶然?)库模块是调试版本,但主应用程序模块是发布版本,那么我希望测试表明该应用程序是发布版本。
也许这没有多大意义(我对 iOS 完全陌生),但是对于我的 Android 应用程序,这是可能的 - 请参阅此处的第一个答案: 如何检查 APK 是否已签名或“调试版本”?
所以我想知道 iOS 应用程序是否存在一些类似的技术。最好是可以从 Swift 完成的事情。
我正在学习如何使用 LiteDB。这是我用来将 .Net 对象插入数据库的一些 C# 代码:
// Create new YacksProjectInfo object and insert it into the database
YacksProjectInfo projectInfo = new YacksProjectInfo(AssemblyName, moduleNumber);
yacksProjects.Insert(projectInfo); // Id field generated automatically
yacksProjects.EnsureIndex((YacksProjectInfo x) => x.ProjectName);
yacksProjects.EnsureIndex((YacksProjectInfo x) => x.ModuleNumber);
Run Code Online (Sandbox Code Playgroud)
换句话说,每次向数据库添加新对象时,我都使用了EnsureIndex() 方法。但我猜这不是必需的,您只需要在插入第一个对象后执行一次。
有人可以确认是否需要每次都执行 ensureIndex() ,或者一次就足够了吗?
我想调用一个重载的回调方法,该方法可以接受几种不同类型的参数。
string s = "some text";
PerformCallback(s);
int i = 42;
PerformCallback(i);
byte[] ba = new byte[] { 4, 2 };
PerformCallback(ba);
Run Code Online (Sandbox Code Playgroud)
到目前为止没有问题。但是现在我想拥有两种不同类型的字节数组,我们称它们为蓝色字节数组和绿色字节数组。字节数组本身就是字节数组。它们的蓝色和绿色只是一个哲学概念,但是我想写一个重载的回调方法,该方法对两种字节数组有两种不同的重载,以及一种调用两种不同的重载的方式。我非常希望避免使用额外的参数来指示字节数组的颜色,并且我希望避免任何添加封闭类或类似内容的事情,这些都会增加运行时开销。
有任何想法吗?提前致谢。
请耐心等待,我的MAPI知识很少,而且我的C++技能基本......
我有一个程序,使用MAPI从Exchange服务器读取所有可能的日历约会.除了一种奇怪的情况外,情况正常.
如果定期约会有大量异常,那么似乎我从MAPI获取的RecurrenceState属性已被截断为1200字节.我可以在OutlookSpy中看到实际上有1400个字节.(奇怪的巧合,两个数字都是100的倍数?)
通过为10个特定属性设置称为SizedSPropTagArray的东西来访问约会,其中一个属性是RecurrenceState,然后执行QueryRows操作.当我访问该属性的Value.bin.cb字段时,它通常是正确的,但是当它应该是1400时,这个特定属性显然包含1200.
希望有人有一个建议 - TIA.
编辑:
德米特里,你说"在你读取属性值之前,你检查类型是否仍然是PT_BINARY?还是变为PT_ERROR?"
我看不出我应该怎么做.我正在做一个QueryRows,一次最多可以达到100个约会.然后我遍历LPSRowSet来处理查询的结果,即最多100个SRow对象.因此,为了处理RecurrenceState,我使用了sRow.lpProps [columnIndex],它提供了一个SPropValue.现在,这里似乎没有任何东西表明返回属性的类型..ulPropTag字段正确包含RecurrenceState属性的id,而.Value.bin.cb提供了一个长度,通常是正确的,但是当数据很长时,它是一个较低的值.我应该测试什么来查看您所描述的错误是否已经发生?谢谢.
编辑2:
德米特里,我非常感谢你的帮助,我相信你的基本想法一定是正确的.但不幸的是,当发生错误情况时,我无法进行任何测试.
我现在能够在我们自己的Exchange服务器上重现这种情况,唯一的区别是对于我们的Exchange服务器,RecurrenceState数据的限制显然是510字节,而不是我们客户安装时看到的1200字节.
以下是在Visual Studio调试器下运行时程序中数据的一些复制和粘贴捕获.正常重复约会中的第一个,其异常数据不会被截断:
sRow.lpProps[recurrenceInfoIndex].ulPropTag = 0x818b0102
sRow.lpProps[recurrenceInfoIndex].Value = {i=0x01da l=0x000001da ul=0x000001da ...}
Run Code Online (Sandbox Code Playgroud)
下一个是有许多例外的约会,RecurrenceState数据被截断:
sRow.lpProps[recurrenceInfoIndex].ulPropTag = 0x818b0102
sRow.lpProps[recurrenceInfoIndex].Value = {i=0x01fe l=0x000001fe ul=0x000001fe ...}
Run Code Online (Sandbox Code Playgroud)
请注意.ulPropTag与OK约会相同,数据长度为0x1fe = 510,但我知道它实际上更多.
我想知道,是否可能有一些开关我应该设置表明我想要这种错误的反馈?
或者还有其他我误解的东西?
谢谢.
我正在尝试修改Microsoft Roslyn编译器来执行超出所提供API范围的一些奇怪的事情.但我对罗斯林来说是全新的,罗斯林是庞大的(460万行代码),我发现很难找到它的方法.
具体来说,我想找到发出".class"IL语句的位置,并且通常是执行C#类的最终编译,即类的外部结构.(我发现内部的东西像方法和表达式一样.)
编辑:
@nejcs是正确的,在发出的代码中没有".class"IL语句这样的东西.当你使用.Net Reflector或dotPeek时,我错误地想到了你所看到的.
我将尝试更详细地解释我正在尝试做什么,以及我正在寻找什么,希望能让我做我想做的事情.
考虑一个简单的C#类,如下所示:
public static class Yacks00020001
{
public static readonly string s;
static Yacks00020001()
{
s = YacksCore.M0002("Hello world!", 42);
}
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是在发射器处理期间"创建"并在运行中发出大量这些静态对象(显然具有不同的名称和不同的字符串).我希望通过创建足够的模拟数据来"欺骗"发出类声明,方法和语句的发射器方法,并使用此模拟输入调用它们.
我想在编译期间我找到了描述C#类声明的对象,它在这里:
它在这里创建:
但我不是百分百肯定的.
尽管@nejcs在他的回答中提供了很好的信息,但我仍然无法在发射器处理中找到发出类声明的位置.
我有以下声明:
private Enum _statusValue;
Run Code Online (Sandbox Code Playgroud)
我真的想说的是:
private Enum _statusValue = 0;
Run Code Online (Sandbox Code Playgroud)
即使我知道这是多余的.只是我喜欢明确指定初始化.
但这是不允许的.
是否有一些简单的方法来指定这种声明的初始化?
编辑 - 让我再试一次.
这是我正在做的一个人为/简化的例子.
using System;
namespace EnumTesting
{
public enum EFixedPhoneUsability
{
UnknownValue, // Should not occur?
IsUsable, // User is near the telephone
NotUsable, // User not near the telephone
BeingUsed, // Busy
DoNotDisturb, // This is phone physical state, not user attitude
CallsForwarded // This is phone physical state
}
public enum EMobilePhoneConnectivity
{
UnknownValue, // Should not occur?
OnNetIdle, // I.e., usable
OnNetBusy, …Run Code Online (Sandbox Code Playgroud) 该互锁类提供方便原子操作,如fetch and add和compare and swap.
MSDN说这个类:
为多个线程共享的变量提供原子操作.
我的问题是:为什么称它为" 联锁 "?它应该意味着什么吗?
因此,当调用Console.Readline并将其分配给要由if语句计算的变量时,我想知道以下代码是否可以互换,如果不是,它们如何与我的应用程序选择一个而不同.
//code omitted
var answer = Console.ReadLine();
if (answer.GetType() == typeOf(string))
{
Console.WriteLine("Awesome");
}
// code omitted
Run Code Online (Sandbox Code Playgroud)
只是基本上想知道是否使用它
if (answer is string) ...
Run Code Online (Sandbox Code Playgroud)
是更好的选择?