什么\t是在C#中生成字符串的最佳方法
我正在学习C#并尝试不同的方式来说同样的事情.
Tabs(uint t)是返回的功能string与t的量\t的
例如Tabs(3)返回"\t\t\t"
这三种实施方式中哪Tabs(uint numTabs)一种最好?
当然,这取决于"最佳"的含义.
LINQ版本只有两行,很不错.但重复和聚合的调用是否会不必要地耗费时间/资源?
该StringBuilder版本是很清楚的,但是是StringBuilder类莫名其妙慢?
该string版本是基本的,这意味着它很容易理解.
这根本不重要吗?它们都是平等的吗?
这些都是帮助我更好地了解C#的问题.
private string Tabs(uint numTabs)
{
IEnumerable<string> tabs = Enumerable.Repeat("\t", (int) numTabs);
return (numTabs > 0) ? tabs.Aggregate((sum, next) => sum + next) : "";
}
private string Tabs(uint numTabs)
{
StringBuilder sb = new StringBuilder();
for (uint i = 0; i < numTabs; i++)
sb.Append("\t");
return sb.ToString(); …Run Code Online (Sandbox Code Playgroud) 在下面的代码中,由于接口,类LazyBar必须从它的方法返回一个任务(并且为了参数而不能更改).如果LazyBars的实现是不寻常的,那么它恰好快速且同步地运行 - 从方法返回No-Operation任务的最佳方法是什么?
我已经在Task.Delay(0)下面了,但是我想知道如果这个函数被调用了很多(如果参数起见,比如说每秒数百次),这是否有任何性能副作用:
Delay(0)不同方式处理?return Task.Run(() => { });有什么不同?有没有更好的办法?
using System.Threading.Tasks;
namespace MyAsyncTest
{
internal interface IFooFace
{
Task WillBeLongRunningAsyncInTheMajorityOfImplementations();
}
/// <summary>
/// An implementation, that unlike most cases, will not have a long-running
/// operation in 'WillBeLongRunningAsyncInTheMajorityOfImplementations'
/// </summary>
internal class LazyBar : IFooFace
{
#region IFooFace Members
public Task WillBeLongRunningAsyncInTheMajorityOfImplementations()
{
// First, do something really quick
var x = 1; …Run Code Online (Sandbox Code Playgroud) 某些System.Threading.Tasks.Task构造函数将a CancellationToken作为参数:
CancellationTokenSource source = new CancellationTokenSource();
Task t = new Task (/* method */, source.Token);
Run Code Online (Sandbox Code Playgroud)
令我感到困惑的是,从方法体内部无法实际获取传入的令牌(例如,没有什么比这样Task.CurrentTask.CancellationToken).必须通过某种其他机制提供令牌,例如状态对象或在lambda中捕获.
那么在构造函数中提供取消令牌的目的是什么呢?
我经常在我的代码中使用null传播运算符,因为它给了我更多可读代码,特别是在长查询中我不必对每个使用的类进行空值检查.
以下代码抛出一个编译错误,我们不能在lambda中使用null传播运算符.
var cnt = humans.AsQueryable().Count(a => a.House?[0].Price == 5000);
Run Code Online (Sandbox Code Playgroud)
错误 :
错误CS8072表达式树lambda可能不包含空传播运算符.
C#如果真的不能做任何其他事情,可以轻松地将上面的代码转换为代码到下面的代码!
var cnt = humans.AsQueryable().Count(a => a.House != null && a.House[0].Price == 5000);
Run Code Online (Sandbox Code Playgroud)
我很好奇为什么C#什么也不做,只是抛出一个编译器错误?
我正在开发一个以mongodb作为我的后端的网络应用程序.我想让用户将图片上传到他们的个人资料,如链接个人资料照片.我正在使用带有MVC2的aspx页面,我读到GridFs库用于存储大型文件类型作为二进制文件.我到处寻找线索是如何完成的,但是mongodb没有任何关于C#api或GridFs C#的文档.我感到困惑和困惑,真的可以使用另一组大脑.
任何人都知道如何实际实现一个文件上传控制器,用于存储用户上传到mongodb集合中的图像?太感谢了!
我尝试过这种变化无济于事.
Database db = mongo.getDB("Blog");
GridFile file = new GridFile(db);
file.Create("image.jpg");
var images = db.GetCollection("images");
images.Insert(file.ToDocument());
Run Code Online (Sandbox Code Playgroud) .NET 4.6引入了AsyncLocal<T>用于沿异步控制流流动环境数据的类.我以前用过CallContext.LogicalGet/SetData这个目的,我想知道两者在语义上是否以及以何种方式不同(除了明显的API差异,如强类型和缺乏对字符串键的依赖).
在C#设置中,只要变量的大小最大native int(即32位运行时环境中的4个字节和64位上的8个字节),变量的值就是原子级.在一个64位的环境,它包括所有的引用类型和最内置值类型(byte,short,int,long,等等).
设置更大的值不是原子的,并且可能导致仅更新部分内存的撕裂.
DateTime是一个结构,它只包含一个ulong包含其所有数据(Ticks和DateTimeKind)的字段,并且ulong在64位环境中本身是原子的.
这是否意味着它DateTime也是原子的?或者以下代码是否会在某些时候导致撕裂?
static DateTime _value;
static void Main()
{
for (int i = 0; i < 10; i++)
{
new Thread(_ =>
{
var random = new Random();
while (true)
{
_value = new DateTime((long)random.Next() << 30 | (long)random.Next());
}
}).Start();
}
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud) 在性能方面,会这2种方法运行GetAllWidgets()和GetAllFoos()并行?
有没有理由使用一个而不是另一个?在编译器的幕后似乎发生了很多事情,所以我觉得不清楚.
=============方法A:使用多个等待======================
public async Task<IHttpActionResult> MethodA()
{
var customer = new Customer();
customer.Widgets = await _widgetService.GetAllWidgets();
customer.Foos = await _fooService.GetAllFoos();
return Ok(customer);
}
Run Code Online (Sandbox Code Playgroud)
===============方法B:使用Task.WaitAll =====================
public async Task<IHttpActionResult> MethodB()
{
var customer = new Customer();
var getAllWidgetsTask = _widgetService.GetAllWidgets();
var getAllFoosTask = _fooService.GetAllFos();
Task.WaitAll(new List[] {getAllWidgetsTask, getAllFoosTask});
customer.Widgets = getAllWidgetsTask.Result;
customer.Foos = getAllFoosTask.Result;
return Ok(customer);
}
Run Code Online (Sandbox Code Playgroud)
=====================================
我对C#6中的新功能感到非常兴奋,包括新的字符串语法:
var fullName = $"My Name is {FirstName} {LastName}";
Run Code Online (Sandbox Code Playgroud)
但是,我无法弄清楚如何在括号内转义引号来执行以下操作:
bool includePrefix = true;
var fullName = $"My name is {includePrefix ? "Mr. " : ""}{FirstName} {LastName}";
Run Code Online (Sandbox Code Playgroud)
C#6不喜欢这样.String.Format在第二种情况下,我不得不恢复使用.是否可以使用新语法来转义引号?
更新:是的,我已尝试使用\转义,但它无法识别.
我们目前正在开发一个Web应用程序,它依赖于ASP .NET MVC 5,Angular.JS 1.4,Web API 2和Entity Framework 6.出于可伸缩性的原因,Web应用程序的重量依赖于async/await模式.我们的域需要一些cpu密集型计算,这可能需要几秒钟(<10s).在过去,一些团队成员使用Task.Run,以加快计算速度.因为在ASP .NET MVC或Web API控制器中启动一个额外的线程被认为是一种不好的做法(该线程不为IIS所知,所以不是在AppDomain Recycle上考虑=>参见Stephen Cleary的博客文章),他们使用了ConfigureAwait(false).
public async Task CalculateAsync(double param1, double param2)
{
// CalculateSync is synchronous and cpu-intensive (<10s)
await Task.Run(() => this.CalculateSync(param1, param2))).ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)
c# ×10
.net ×7
async-await ×4
c#-6.0 ×2
.net-4.0 ×1
.net-4.6 ×1
asp.net ×1
asp.net-mvc ×1
concurrency ×1
datetime ×1
gridfs ×1
mongodb ×1
string ×1
tearing ×1
threadpool ×1