国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Jadual Kandungan
Paypal Checkout JS 支付模式
RESTful API 支付模式
Rumah pembangunan bahagian belakang Tutorial C#.Net Paypal 支付功能的 C# .NET / JS 實(shí)現(xiàn)

Paypal 支付功能的 C# .NET / JS 實(shí)現(xiàn)

Aug 10, 2018 pm 05:11 PM

說(shuō)明

最近用到了 Paypal 支付功能,英語(yǔ)一般般的我也不得不硬著頭皮踩一踩這樣的坑。經(jīng)過(guò)近乎半個(gè)月的作,終于實(shí)現(xiàn)了簡(jiǎn)單的支付功能,那么首先就說(shuō)說(shuō)使用 Paypal 必定要知道的幾點(diǎn)(當(dāng)前日期 2018年08月07日):

1. 你應(yīng)該知道 Paypal 支付功能是支持銀聯(lián)卡的,但是不支持中國(guó)買家賬號(hào)支付給中國(guó)賣家賬號(hào)

2. Paypal 接口有兩套,切記,產(chǎn)品環(huán)境和 sandbox 測(cè)試環(huán)境不同

3. 測(cè)試賬號(hào)同樣不能使用中國(guó)賬號(hào)給中國(guó)賬號(hào)付款

4. 如果你僅僅想具有固定金額的支付按鈕,用你的 Paypal 商家賬號(hào)登錄官網(wǎng),配置頁(yè)里面完全可以配置出固定的支付按鈕,然后 Copy 對(duì)應(yīng)的 Html 到你的頁(yè)面就 OK 了,也就沒(méi)有必要通過(guò)更復(fù)雜的方式去支付了

image

5. 如果你必須動(dòng)態(tài)價(jià)格和商品信息、或者你要學(xué)習(xí)基本的 Paypal 接口的話,那么就請(qǐng)靜靜的往下看吧

6. 真實(shí)環(huán)境支付 Paypal 每一筆都需要收取商家賬號(hào)手續(xù)費(fèi)的,并且手續(xù)費(fèi)不低,如果你用真實(shí)環(huán)境測(cè)試,那么一定要記得每一筆都申請(qǐng)退款吧,退款很方便,商家后臺(tái)就能直接發(fā)起,退款幾乎是實(shí)時(shí)的。

Paypal 費(fèi)用說(shuō)明:https://www.paypal.com/businesswallet/fees/paypal-fees

image

image

?相關(guān)資料

Paypal 官方地址:https://www.paypal.com/

Paypal 官方測(cè)試地址:https://www.sandbox.paypal.com

Paypal 開(kāi)發(fā)者中心:https://developer.paypal.com/

Paypal API:?https://api.paypal.com

Paypal sandbox API:?https://api.sandbox.paypal.com

Paypal Checkout JS 支付模式

模式圖片:

?image

模式說(shuō)明:

Checkout JS 模式是一種前端實(shí)現(xiàn),使用官方提供的 Checkout.js SDK 實(shí)現(xiàn)支付,不需要自己寫(xiě)直接調(diào)用接口的代碼,相對(duì)而言也挺簡(jiǎn)單,但是如果你想檢測(cè)支付是否成功,你應(yīng)當(dāng)通過(guò)調(diào)用接口的方式驗(yàn)證了。

支付部分代碼:

<p id="paypal-button"></p>
<script src="https://www.paypalobjects.com/api/checkout.js"></script>
<script type="text/javascript">
    paypal.Button.render({
        env: &#39;production&#39;, // production or sandbox 表示產(chǎn)品環(huán)境還是測(cè)試環(huán)境
        client: {
            production: &#39;&#39;, // 產(chǎn)品環(huán)境,值為字符串,配置實(shí)際商家號(hào)的 ClientId
            // sandbox: &#39;&#39;, // 測(cè)試環(huán)境,值為字符串,配置商家測(cè)試號(hào)的 ClientId
        },
        style: {
            size: &#39;medium&#39;,
            color: &#39;black&#39;,
            shape: &#39;pill&#39;,
            label: &#39;paypal&#39;,
            tagline: &#39;false&#39;,
            fundingicons: &#39;true&#39;
        },
        commit: true,
        payment: function (data, actions) {
            return actions.payment.create({
                transactions: [
                    {
                        amount: {
                            total: "0.01",
                            currency: "USD"
                        },
                        description: "測(cè)試商品描述",
                        custom: "X00002"
                    }
                ],
                redirect_urls: {
                    return_url: &#39;http://localhost:4478/Success.aspx?type=js&#39;,
                    cancel_url: &#39;http://localhost:4478/Cancel.aspx&#39;
                }
            });
        },
        onAuthorize: function (data, actions) {
            return actions.payment.execute()
                .then(function () {
                    actions.redirect();
                });
        },
        onCancel: function (data, actions) {
            actions.redirect();
        }
    }, &#39;#paypal-button&#39;);
</script>

如果你需要在支付跳轉(zhuǎn)的成功頁(yè)再次驗(yàn)證一下是否支付成功,你需要自己調(diào)用官方提供的 RESTful API,參見(jiàn)下文的 RESTful API 支付模式

RESTful API 支付模式

說(shuō)明

接口的方式很常見(jiàn),和支付寶的接口類似,只是使用了 RESTful API 的模式,采用了 Basic Auth 的加密方式。使用接口的模式很常規(guī),我們?cè)陧?yè)面點(diǎn)擊按鈕調(diào)用支付接口,彈出支付頁(yè),支付成功跳轉(zhuǎn)到成功頁(yè)面,成功頁(yè)面再調(diào)用確認(rèn)支付接口確認(rèn)結(jié)果。

支付接口調(diào)用:

using System;
using System.Text;
using System.Web.Script.Serialization;
using cn.lovelong.Paypal.Config;
using cn.lovelong.Paypal.Enums;
using cn.lovelong.Paypal.Model;

namespace cn.lovelong.Paypal.Paypal
{
    /// <summary>
    /// CreatePayment 的摘要說(shuō)明
    /// </summary>
    public class CreatePayment
    {
        public CreatePayment()
        {
        }

        public PaymentResult Pay(string json)
        {
            var jsonResult = HttpHelper.PostJson(
                UrlConfig.CreatePaymentUrl, 
                AccountConfig.ClientId, AccountConfig.Secret, json,
                Encoding.UTF8);
            var result = new JavaScriptSerializer().Deserialize<PaymentResult>(jsonResult);
            return result;
        }

        public PaymentResult Pay(PaymentParam param)
        {
            var json = GetPayParams(param);
            return Pay(json);
        }
        
        public string GetPayParams(PaymentParam param)
        {
            var total = param.Total.ToString("N");
            var currency = Enum.GetName(typeof (PaypalCurrency), param.Currency);
            var payParams = new
            {
                intent = "sale",
                redirect_urls = new
                {
                    return_url = param.ReturnUrl,
                    cancel_url = param.CancelUrl,
                },
                payer = new
                {
                    payment_method = "paypal"
                },
                transactions = new dynamic[]
                {
                    new
                    {
                        amount = new
                        {
                            total = total,
                            currency = currency
                        },
                        description = param.Description,
                        custom = param.Code,
                        item_list = new
                        {
                            items = new dynamic[]
                            {
                                new
                                {
                                    name = param.Name,
                                    //description = param.Name,
                                    quantity = "1",
                                    price = total,
                                    //tax = "0.01",
                                    //sku = "1",
                                    currency = currency
                                }
                            }
                        }
                    }
                }
            };
            var json = new JavaScriptSerializer().Serialize(payParams);
            return json;
        }

        public string GetFullPayParams(decimal total, PaypalCurrency currency, string returnUrl, string cancelUrl)
        {
            var payParams = new
            {
                intent = "sale",
                redirect_urls = new
                {
                    return_url = returnUrl,
                    cancel_url = cancelUrl,
                },
                payer = new
                {
                    payment_method = "paypal"
                },
                transactions = new dynamic[]
                {
                    new
                    {
                        amount = new
                        {
                            total = total.ToString("N"),
                            currency = Enum.GetName(typeof(PaypalCurrency),currency),
                            details = new
                            {
                                subtotal = "30.00",
                                tax = "0.07",
                                shipping = "0.03",
                                handling_fee = "1.00",
                                shipping_discount = "-1.00",
                                insurance = "0.01"
                            }
                        },
                        description = "",
                        custom = "EBAY_EMS_90048630024435",
                        invoice_number = "48787589673",
                        payment_options = new
                        {
                            allowed_payment_method = "INSTANT_FUNDING_SOURCE"
                        },
                        soft_descriptor = "ECHI5786786",
                        item_list = new
                        {
                            items = new dynamic[]
                            {
                                new
                                {
                                    name = "hat",
                                    description = "Brown hat.",
                                    quantity = "5",
                                    price = "3",
                                    tax = "0.01",
                                    sku = "1",
                                    currency = "USD"
                                }
                            },
                            shipping_address = new
                            {
                                recipient_name = "Brian Robinson",
                                line1 = "4th Floor",
                                line2 = "Unit #34",
                                city = "San Jose",
                                country_code = "US",
                                postal_code = "95131",
                                phone = "011862212345678",
                                state = "CA"
                            },
                        }
                    }
                }
            };
            var json = new JavaScriptSerializer().Serialize(payParams);
            return json;
        }
    }
}

確認(rèn)支付接口:

using System.Text;
using System.Web.Script.Serialization;
using cn.lovelong.Paypal.Config;
using cn.lovelong.Paypal.Model;

namespace cn.lovelong.Paypal.Paypal
{
    /// <summary>
    /// Approved 的摘要說(shuō)明
    /// </summary>
    public class Approved
    {
        public PaymentResult DoJson(string paymentId, dynamic json)
        {
            var jsonResult = HttpHelper.PostJson(string.Format(UrlConfig.ApprovedUrl, paymentId), 
                AccountConfig.ClientId, AccountConfig.Secret, json, Encoding.UTF8);
            var result = new JavaScriptSerializer().Deserialize<PaymentResult>(jsonResult);
            return result;
        }

        public PaymentResult Do(string paymentId, string payerId)
        {
            var json = GetPayParams(payerId);
            return DoJson(paymentId, json);
        }

        public string GetPayParams(string payerId)
        {
            var payParams = new
            {
                payer_id = payerId
            };
            var json = new JavaScriptSerializer().Serialize(payParams);
            return json;
        }
    }
}

查詢支付結(jié)果接口調(diào)用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;
using cn.lovelong.Paypal.Config;
using cn.lovelong.Paypal.Model;

namespace cn.lovelong.Paypal.Paypal
{
    public class ShowPaymentDetails
    {
        public PaymentResult Do(string paymentId)
        {
            var json = HttpHelper.Get(
                string.Format(UrlConfig.ShowPaymentDetailsUrl, paymentId), 
                AccountConfig.ClientId, AccountConfig.Secret,
                Encoding.UTF8);
            var result = new JavaScriptSerializer().Deserialize<PaymentResult>(json);
            return result;
        }
    }
}

最容易出問(wèn)題的反而是通用類 HttpHelper:

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;

namespace cn.lovelong.Paypal
{
    public class HttpHelper
    {
        public static string PostForm(string url, string userName, string password, Dictionary<string,object> dic, Encoding encoding)
        {
            var param = string.Empty;
            foreach (var o in dic)
            {
                if (string.IsNullOrEmpty(param))
                    param += o.Key + "=" + o.Value;
                else
                    param += "&" + o.Key + "=" + o.Value;
            }
            byte[] byteArray = encoding.GetBytes(param);

            //處理HttpWebRequest訪問(wèn)https有安全證書(shū)的問(wèn)題( 請(qǐng)求被中止: 未能創(chuàng)建 SSL/TLS 安全通道。)
            ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
            
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(encoding.GetBytes(userName + ":" + password)));
            request.PreAuthenticate = true;

            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = byteArray.Length;

            //寫(xiě)入?yún)?shù)
            Stream newStream = request.GetRequestStream();
            newStream.Write(byteArray, 0, byteArray.Length);
            newStream.Close();

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                using (var stream = response.GetResponseStream())
                {
                    if(stream != null)
                    using (StreamReader sr = new StreamReader(stream, Encoding.UTF8))
                    {
                        return sr.ReadToEnd();
                    }
                }
            }
            return string.Empty;
        }

        public static string PostJson(string url, string userName, string password, string json, Encoding encoding)
        {
            byte[] byteArray = encoding.GetBytes(json);

            //處理HttpWebRequest訪問(wèn)https有安全證書(shū)的問(wèn)題( 請(qǐng)求被中止: 未能創(chuàng)建 SSL/TLS 安全通道。)
            ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 |
                                                    SecurityProtocolType.Tls;

            HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);
            request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(encoding.GetBytes(userName + ":" + password)));
            request.PreAuthenticate = true;

            request.Method = "POST";
            request.Headers.Add("Cache-Control", "no-cache");
            request.ContentType = "application/json";
            request.ContentLength = byteArray.Length;

            //寫(xiě)入?yún)?shù)
            Stream newStream = request.GetRequestStream();
            newStream.Write(byteArray, 0, byteArray.Length);
            newStream.Close();

            using (HttpWebResponse response = (HttpWebResponse) request.GetResponse())
            {
                using (var stream = response.GetResponseStream())
                {
                    if (stream != null)
                        using (StreamReader sr = new StreamReader(stream, Encoding.UTF8))
                        {
                            return sr.ReadToEnd();
                        }
                }
            }
            return string.Empty;
        }
        
        public static string Get(string url, string userName, string password, Encoding encoding)
        {
            //處理HttpWebRequest訪問(wèn)https有安全證書(shū)的問(wèn)題( 請(qǐng)求被中止: 未能創(chuàng)建 SSL/TLS 安全通道。)
            ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 |
                                                    SecurityProtocolType.Tls;

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(encoding.GetBytes(userName + ":" + password)));
            request.PreAuthenticate = true;

            request.Method = "GET";
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                using (var stream = response.GetResponseStream())
                {
                    if (stream != null)
                        using (StreamReader sr = new StreamReader(stream, Encoding.UTF8))
                        {
                            return sr.ReadToEnd();
                        }
                }
            }
            return string.Empty;
        }
    }
}
主要的功能都已經(jīng)實(shí)現(xiàn)了!看看演示 Demo 吧!
1. 支付頁(yè)面
2. Checkout JS 方式(如果你的頁(yè)面點(diǎn)擊登錄之后一直在第二個(gè)頁(yè)面轉(zhuǎn)圈的話,那只能說(shuō)明你的登錄賬號(hào)不能支付你的商家賬號(hào),或者你的賬號(hào)如果登錄之后顯示添加銀行卡的提示,說(shuō)明你的商家賬號(hào)和你的賬號(hào)都是中國(guó)賬號(hào),那你只能添加多幣種卡支付,不能用銀聯(lián)支付了):
付款就好了!
3. 接口方式我就沒(méi)有使用彈出頁(yè)面了,最簡(jiǎn)單的方式(接口會(huì)直接在調(diào)用接口的頁(yè)面觸發(fā)支付跳轉(zhuǎn)),點(diǎn)擊接口支付
我就不支付了,我用的商家賬號(hào)是自己的新加坡的賬號(hào), 按照今天的匯率 $0.01 = ¥0.068,你至少需要支付 0.07 元才能完成支付,而文章開(kāi)頭也說(shuō)了,商家需要付稅,也就是說(shuō)你支付的 0.07 都會(huì)變成給 Paypal 的稅,商家一分錢也拿不到,也就是說(shuō),你至少支付 3.5元人民幣($0.51 = ¥3.481)商家才能得到微額的款項(xiàng)。
下面給出 Demo 源碼,源碼中配置的商家號(hào)是我自己的,請(qǐng)自行修改,為了方便大家沒(méi)有商家賬號(hào)的朋友做測(cè)試我就不刪除了,朋友們也不要真的支付測(cè)試,你的測(cè)試只會(huì)讓 Paypal 賺錢而已!
我的開(kāi)發(fā)環(huán)境是 VS2015 + C# 6.0 + JS ,代碼僅供參考,請(qǐng)自行修改擴(kuò)展學(xué)習(xí)使用!

相關(guān)推薦:

調(diào)用支付寶PHP接口API實(shí)現(xiàn)在線即時(shí)支付功能

.Net實(shí)現(xiàn)微信JS-SDK分享功能代碼展示-C#.Net教程

Atas ialah kandungan terperinci Paypal 支付功能的 C# .NET / JS 實(shí)現(xiàn). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah kepentingan kata kunci hasil dalam C# untuk membuat iterators? Apakah kepentingan kata kunci hasil dalam C# untuk membuat iterators? Jun 19, 2025 am 12:17 AM

TheyieldkeywordinC#simplifiesiteratorcreationbyautomaticallygeneratingastatemachinethatenableslazyevaluation.1.Itallowsreturningitemsoneatatimeusingyieldreturn,pausingexecutionbetweeneachitem,whichisidealforlargeordynamicsequences.2.yieldbreakcanbeus

Apakah suntikan ketergantungan (DI), dan bagaimanakah ia boleh dilaksanakan dalam C# (mis., Menggunakan DI terbina dalam di ASP.NET Core)? Apakah suntikan ketergantungan (DI), dan bagaimanakah ia boleh dilaksanakan dalam C# (mis., Menggunakan DI terbina dalam di ASP.NET Core)? Jun 30, 2025 am 02:06 AM

DependencyInjection(DI)inC#isadesignpatternthatenhancesmodularity,testability,andmaintainabilitybyallowingclassestoreceivedependenciesexternally.1.DIpromotesloosecouplingbydecouplingobjectcreationfromusage.2.Itsimplifiestestingthroughmockobjectinject

Apakah tujuan antara muka idisposable dan pernyataan menggunakan C# untuk pengurusan sumber? Apakah tujuan antara muka idisposable dan pernyataan menggunakan C# untuk pengurusan sumber? Jun 27, 2025 am 02:18 AM

Peranan idisposable dan menggunakan dalam C# adalah dengan cekap dan deterministik menguruskan sumber yang tidak diurus. 1. Idisposable menyediakan kaedah pelupusan (), supaya kelas dapat dengan jelas menentukan cara melepaskan sumber yang tidak diurus; 2. Pernyataan yang menggunakan memastikan yang melupuskan () secara automatik dipanggil apabila objek itu keluar dari skop, memudahkan pengurusan sumber dan mengelakkan kebocoran; 3. Apabila menggunakannya, sila ambil perhatian bahawa objek mesti melaksanakan idisposable, boleh mengisytiharkan pelbagai objek, dan harus selalu menggunakan menggunakan jenis seperti Streamreader; 4. Amalan terbaik biasa termasuk tidak bergantung kepada pemusnah untuk membersihkan, mengendalikan objek bersarang dengan betul, dan melaksanakan corak pelupusan (bool).

Bagaimanakah Ekspresi Lambda dan LINQ (Pertanyaan Bersepadu Bahasa) meningkatkan manipulasi data dalam C#? Bagaimanakah Ekspresi Lambda dan LINQ (Pertanyaan Bersepadu Bahasa) meningkatkan manipulasi data dalam C#? Jun 20, 2025 am 12:16 AM

Lambdaexpressionsandlinqsimplifydatamanipulationinc#byenablingconcise, boleh dibaca, andefficientcode.1.LambdaExpressionsAllowinFunctionDefinitions, MakingeasierToPasslogicasArgumentsForfiltering, transforming, dangregatasi

Apakah jenis rujukan yang boleh dibatalkan (NRTs) dalam C# 8, dan bagaimana mereka membantu mencegah NullReferenceException? Apakah jenis rujukan yang boleh dibatalkan (NRTs) dalam C# 8, dan bagaimana mereka membantu mencegah NullReferenceException? Jun 21, 2025 am 12:36 AM

NullableReferenceTypes (NRTS) Inc#8 HelpCatchNulleFerenceExceptionErrorsatCompileTimeByMakeRereCetypesNon-nullByDefault, MemerlukanExplicitDeclarationFornulability.nrtsmustBeenableDile.csprojfileShileHenableShenabeShen

Apakah beberapa perangkap biasa atau anti-corak untuk dielakkan ketika berkembang dengan C#? Apakah beberapa perangkap biasa atau anti-corak untuk dielakkan ketika berkembang dengan C#? Jun 23, 2025 am 12:05 AM

Empat masalah "anti-corak" dalam pembangunan C# perlu dielakkan. Pertama, penggunaan async/menunggu yang tidak munasabah membawa kepada kebuntuan atau kemerosotan prestasi. Kita harus mematuhi prinsip asynchronousness penuh, mengkonfigurasi configureAwait (palsu) dan menyeragamkan penamaan; Kedua, kebergantungan yang berlebihan terhadap VAR mempengaruhi kebolehbacaan, dan secara eksplisit mengisytiharkan dan menyatukan spesifikasi pasukan apabila jenisnya tidak jelas; Ketiga, penggunaan pelupusan dan pengurusan sumber yang tidak betul menyebabkan kebocoran, dan pernyataan penggunaan harus digunakan dengan betul dan mod standard idisposable harus dilaksanakan; Keempat, penyalahgunaan kelas statik atau singleton menyebabkan kesukaran ujian, dan keutamaan harus diberikan kepada suntikan ketergantungan, ketenteraan, atau kitaran hayat yang diuruskan oleh bekas. Mengelakkan salah faham ini dapat meningkatkan kualiti dan penyelenggaraan kod dengan ketara.

Bagaimanakah span  dan memori  digunakan dalam C# untuk mengoptimumkan penggunaan memori dan mengurangkan peruntukan? Bagaimanakah span dan memori digunakan dalam C# untuk mengoptimumkan penggunaan memori dan mengurangkan peruntukan? Jun 18, 2025 am 12:11 AM

Span dan memori meningkatkan prestasi C# dengan mengurangkan peruntukan memori. 1. Span mengelakkan penyalinan array dan memberikan rujukan cahaya kepada memori yang sedia ada, yang sesuai untuk parsing protokol binari, operasi rentetan dan pengurusan penampan berprestasi tinggi; 2. Memori menyokong lulus irisan memori merentasi kaedah tak segerak, yang sesuai untuk senario di mana kitaran hayat yang lebih fleksibel diperlukan; 3. Kedua -duanya mengurangkan tekanan GC, mengoptimumkan prestasi dengan menggunakan semula buffer dan mengelakkan penyalinan sementara; 4. Span adalah terhad untuk digunakan pada timbunan dan tidak dapat disimpan dalam kelas atau digunakan dalam kaedah asynchronous. Berhati -hati untuk mengelakkan operasi penugasan semula seperti calls.toarray ().

Bolehkah anda menerangkan prinsip-prinsip yang kukuh dan aplikasi mereka dalam reka bentuk berorientasikan objek C#? Bolehkah anda menerangkan prinsip-prinsip yang kukuh dan aplikasi mereka dalam reka bentuk berorientasikan objek C#? Jun 25, 2025 am 12:47 AM

Prinsip pepejal adalah lima prinsip reka bentuk untuk meningkatkan pemeliharaan kod dan skalabilitas dalam pengaturcaraan berorientasikan objek. Mereka adalah: 1. Prinsip Tanggungjawab Tunggal (SRP) menghendaki kelas hanya menganggap satu tanggungjawab, seperti memisahkan generasi laporan dan menghantar e -mel; 2. Prinsip pembukaan dan penutupan (OCP) menekankan bahawa lanjutan disokong melalui antara muka atau kelas abstrak tanpa mengubah kod asal, seperti menggunakan antara muka ishape untuk merealisasikan pengiraan kawasan grafik yang berbeza; 3. Prinsip Penggantian Richter (LSP) menghendaki subkelas boleh menggantikan kelas induk tanpa memusnahkan logik, seperti persegi tidak boleh tersilap mewarisi segi empat tepat, mengakibatkan tingkah laku yang tidak normal; 4. Prinsip Pengasingan Antara Muka (ISP) menganjurkan definisi antara muka halus, seperti percetakan dan fungsi pengimbasan untuk mengelakkan kebergantungan yang berlebihan; 5. Prinsip Inversi Ketergantungan (DIP) menganjurkan

See all articles