-
Notifications
You must be signed in to change notification settings - Fork 4.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Proposal: Add IdnMapping Span-based APIs #32411
Comments
In general, the proposal looks reasonable. Why we need the APIs: public string GetAscii(ReadOnlySpan<char> unicode);
public string GetUnicode(ReadOnlySpan<char> ascii); I don't think these are useful if we are going to allocate a string anyway. And the other proposed APIs can be used at that time. What do you think about that? |
Those aren't needed in my use-cases, as I'll remove them as they could easily be exposed later if a use-case presents itself. |
I don't understand these APIs:
What does the |
The idea was for both the I agree the Span overload would be confusing to use since you couldn't differentiate between invalid input/insufficient space, without ensuring you supply a worst-case sized buffer. Do we have a pattern of // Existing
public string GetAscii(string unicode);
// New
public string GetAscii(ReadOnlySpan<char> unicode);
bool TryGetAscii(ReadOnlySpan<char> unicode, Span<char> destination, out int charsWritten); Alternatively, we would need an |
Yes, Try methods can still throw.
Why not just: string GetAscii(ReadOnlySpan<char> unicode);
bool TryGetAscii(ReadOnlySpan<char> unicode, Span<char> destination, out int charsWritten); ? If the exception for invalid input really is unexceptional, though, with the exception happening so frequently as to be a performance problem in real situations, then yeah, OperationStatus is what you'd want. Can you share examples where the exception is a meaningful problem? |
Yes, that is the shape we'd want (lazy copy-pasting, I've edited the comment). A few examples of exceptional inputs from reading IdnMapping code:
I wouldn't expect the performance overhead of exceptions to be a problem for well-behaving apps. Edit:
No. |
Moving this to 6.0.0 as it is not yet approved and we're driving 5.0.0 issues down. Move it back if you think this is still needed in 5.0.0. |
This is too late for 6.0.0 at this point. |
namespace System.Globalization;
public sealed class IdnMapping
{
// Existing API
// public string GetAscii(string unicode);
// public string GetAscii(string unicode, int index);
// public string GetAscii(string unicode, int index, int count);
//
// public string GetUnicode(string ascii);
// public string GetUnicode(string ascii, int index);
// public string GetUnicode(string ascii, int index, int count);
// Proposed API
public string GetAscii(ReadOnlySpan<char> unicode);
public bool TryGetAscii(ReadOnlySpan<char> unicode, Span<char> destination, out int charsWritten);
public string GetUnicode(ReadOnlySpan<char> ascii);
public bool TryGetUnicode(ReadOnlySpan<char> ascii, Span<char> destination, out int charsWritten);
} |
The current
IdnMapping
API accepts/returns strings and throws on invalid input. I propose a set of Span-based APIs to avoid allocations.Both
Get
andTryGet*
methods would throw on invalid input.TryGet*
would return false on insufficient space in the destination span.This new API would simplify call sites and remove allocations throughout code dealing with internationalized domain names, like Uri and Markdig.
cc: @tarekgh
The text was updated successfully, but these errors were encountered: